热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql中char、varchar、nvarchar数据类型的用法区别

mysql中char、varchar、nvarchar数据类型的用法区别有需要的朋友可

mysql中char、varchar、nvarchar数据类型的用法区别 有需要的朋友可

说明:
1、char:
固定长度的非 Unicode 字符数据,最大长度为 8,000 个字符。
2、varchar:
可变长度的非 Unicode 数据,最长为 8,000 个字符。
3、nvarchar:
可变长度 Unicode 数据,其最大长度为 4,000 字符。
4、nchar
固定长度的 Unicode 数据,最大长度为 4,000 个字符。
5、char和varchar都是字符串类型的
用Unicode编码的字符串,结果是字符的整数值


如有以下数据结构:

工号 姓名 部门
———————–
1 张三 财务
2 李四 人事
3 王五 销售
……..

我们定义”姓名”为char(10)(静态)的时简单地用php代码表示:
简单地模拟底层数据存储链表$data

代码如下
$col_num_len =1; //工号长度为1
$col_name_len=10; //姓名长度为10
$col_unit_len =4; //部门长度为4
$col_len=$col_num_len+$col_name_len+$col_unit_len+3;

//表示每笔记录的总长度,包括3个分隔符
实现如下:

代码如下

$data="1|张三 |财务|2|李四 |人事|3|王五 |销售|..."; //简单地模拟底层数据存储链表

//假设查找第2条记录的"姓名"字段数据
$record_start=$col_len*1+1; //获取第2行的起始位置
$record =substr($data,$record_start,$col_len); //获取第2条记录
$col_name_start=$col_num_len+2; //获取"姓名"字段的起始位置
$col_name=substr($record,$col_name_start,$col_name_len); //获取"姓名"字段的数据
echo $col_name;

-----------

代码如下
//假设更新第2条记录的"姓名"字段数据为"李小四"
$update_info="李小四";
$data=substr_replace($data,$update_info,$col_name_start,$col_name_len); //更新字段,流程结束
而如果我们定义”姓名”字段为varchar(10)(动态)的时候情况则要复杂:
注意存储”姓名”的字段没有空格,这是char和varchar的存储区别
$col_num_len =1; //工号长度为1
$col_name_len=10; //姓名长度为10
$col_unit_len =4; //部门长度为4
$col_len=$col_num_len+$col_name_len+$col_unit_len+3;

实现如下:

代码如下

//动态存放数据行的起始位置,数据为更新时生成(重新)
$record_1_start=1;$record_1_name_dynamic_len=4; //$col_1_name_dynamic_len记录"姓名"动态字段的长度
$record_2_start=13;$record_2_name_dynamic_len=4;
$record_3_start=26;$record_3_name_dynamic_len=6;
...

$data="1|张三|财务|2|李四|人事|3|王小明|销售|..."; //简单地模拟底层数据存储链表,注意存储"姓名"的字段没有空格

//假设查找第2条记录的"姓名"字段数据
$record_2_end=$record_3_start-1; //获取第2行的结束位置
$record =substr($data,$record_2_start,$record_2_end); //获取第2条记录
$col_name_start=$col_num_len+2; //获取"姓名"字段的起始位置
$col_name=substr($record,$col_name_start,$record_2_name_dynamic_len); //获取"姓名"字段的数据
echo $col_name;

//假设更新第2条记录的"姓名"字段数据为"李小四",这边比静态的复杂很多
$update_info="李小四";
$update_len=strlen($update_info); //获取更新内容的长度
if($diff_len=$update_len-$record_2_name_dynamic_len)
{
$data=substr_replace($data,"",$col_name_start,$record_2_name_dynamic_len); //清除原先数据
$record_2_name_dynamic_len=$update_len; //更新字段的长度(并存储新值)

//在此假设总记录数为n
for($i=2;$i<=n;$i++)
{
${'record_'.$i.'_start'}=${'record_'.$i.'_start'}+$diff_len; //重新更新每个行的起始位置(并存储新值),系统开销大(实际上有不同的方法解决)
}
}

$data=substr_replace($data,$update_info,$col_name_start,0);


文中直接使用”substr_replace”,而在数据量很大的时候,底层实现上的开销也是不小的,在mysql中表现为(Row Migration)现象,在此不作赘述

根据以上的粗略实现证明:
1、varchar类型在更新环节上的系统开销是远大于char类型的。
2、两者间查找搜索性能上是不相上下的。
3、两者间的存储数据量($data)环节上,char要显示大于varchar。
4、大数据量提取时varchar的磁盘IO消耗更低,意味着varchar综合查询性能会更好。
5、没有了。

实际应用中的结论(如在mysql中):
1、char适合字段频繁更新时的应用。
2、varchar更节省磁盘空间。
3、实际应用中大数据量(多行)查询返回,varchar的查询性能比起char来要好出不少。
4、选择char和varchar会改变整体数据结构的算法以及存储方式。在mysql应用中,如已存在varchar字段,那么其它所有的char字段将以varchar方式存储。
5、没有了。

(以上算法仅以PHP简单描述,欢迎更好的思路加以指教)

注:此文原作者的写作时间比较久远了,所以有些地方和现在的有些出入,体现在:

1.在innodb引擎中,char和varchar的实现已无异,效率上并没多大区别。
2.选择char和varchar并不会改变整体数据结构的算法以及存储方式。(我记得这是在MYSQL4里的特性,网上的老文章有讲述,到了MYSQL5实测已无此特性)


总结分析:
文字字段若长度固定,如:身分证号码,就不要用 varchar 或 nvarchar,应该用 char 或 nchar。
支持多语言的站点应考虑使用 Unicode nchar 或 nvarchar 数据类型以尽量减少字符转换问题
文字字段若长度不固定,如:地址,则该用 varchar 或 nvarchar。除了可节省存储空间外,存取硬盘时也会较有效率

推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了游戏开发中的人工智能技术,包括定性行为和非定性行为的分类。定性行为是指特定且可预测的行为,而非定性行为则具有一定程度的不确定性。其中,追逐算法是定性行为的具体实例。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • 大连微软技术社区举办《.net core始于足下》活动,获得微软赛百味和易迪斯的赞助
    九月十五日,大连微软技术社区举办了《.net core始于足下》活动,共有51人报名参加,实际到场人数为43人,还有一位专程从北京赶来的同学。活动得到了微软赛百味和易迪斯的赞助,场地也由易迪斯提供。活动中大家积极交流,取得了非常成功的效果。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
author-avatar
mofa007_903
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有