mysql中char、varchar、nvarchar数据类型的用法区别
发布:smiling 来源: PHP粉丝网 添加日期:2014-10-12 16:42:25 浏览: 评论:0
说明: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++)
- { //phpfensi.com
- ${'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。除了可节省存储空间外,存取硬盘时也会较有效率.
Tags: char varchar nvarchar mysql数据类型
相关文章
- ·mysql中innodb utf8字符集varchar索引长度问题(2014-09-27)
- ·MySQL下varchar类型最大长度是多少(2014-09-28)
- ·mysql获取字符串长度函数(CHAR_LENGTH)(2014-09-28)
- ·mysql中int和varchar的长度详解(2014-09-29)
- ·MySql中varchar,char类型排序CAST CONVERT(2014-10-02)
- ·数据库sql语句to_char优化[mysql和oracle](2014-10-04)
- ·mysql中text与varchar与char的区别(2014-10-07)
- ·mysql length与char_length用法区别(2014-10-08)
- ·mysqli_set_charset和SET NAMES优劣分析(2014-10-09)
- ·mysqld:unknown variable default-character-set=utf8(2014-10-10)
- ·MySQL数据库中CHAR与VARCHAR区别介绍(2014-10-11)
- ·MySql varchar排序 CAST ,CONVERT及用法(2014-10-12)
- ·.mysql 数据库导入错误:40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER(2014-10-13)
- ·sql varchar排序CAST/CONVERT实现语句(2014-10-13)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)