专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »数据库 » mysql中char和varchar的区别分析 »正文

mysql中char和varchar的区别分析

来源: 发布时间:星期三, 2010年5月26日 浏览:0次 评论:0
char和varchar区别

char (13)长度固定 如'www.jb51.net' 存储需要空间 12个

varchar(13) 可变长 如'www.jb51.net' 需要存储空间 13,

从上面可以看得出来char 长度是固定不管你存储数据是多少他都会都固定长度而varchar则处可变长度但他要在总长度上加1这个用来存储位置所以实际应用中用户可以根据自己数据类型来做

再看看char,和varchar在速度上区别吧
复制代码 代码如下:

mysal>create tabe ab(v varchar(4),c char(4));
query ok ,0 rows affected(0.02 sec)
mysql>insert o abc values('ab ','ab ')
query ok ,1 row affected(0.00 sec);
mysql->select concat(v ,'+') ,concat(c ,'+') form abc
ab + | ab+
1rows in (0.00 sec)


从上面可以看出来由于某种原因char 固定长度所以在处理速度上要比varchar快速很多但是对费存储空间所以对存储不大但在速度上有要求可以使用char类型反的可以用varchar类型来例子

注明:

在用char类型时内容后面有空间时必须作相关处理要不就会把空格自动删除

建意:

myisam 存储引擎 建议使用固定长度数据列代替可变长度数据列
memory存储引擎 目前都使用固定数据行存储因此无论使用char varchar列都没关系
innodb 存储引擎 建意使用varchar 类型


以下是其它网友补充


char是种固定长度类型varchar则是种可变长度类型
  char(M)类型数据列里每个值都占用M个字节如果某个长度小于MMySQL就会在它右边用空格补足.(在检索操作中那些填补出来空格将被去掉)在varchar(M)类型数据列里每个值只占用刚好够用字节再加上个用来记录其长度字节(即总长度为L+1字节).

在MySQL中用来判断是否需要进行对据列类型转换规则

  1、在个数据表里如果每个数据列长度都是固定那么每个数据行长度也将是固定
  2、只要数据表里有个数据列长度可变那么各数据行长度都是可变
  3、如果某个数据表里数据行长度是可变那么为了节约存储空间MySQL会把这个数据表里固定长度类型数据列转换为相应可变长度类型.
例外:长度小于4个char数据列不会被转换为varchar类型

  对于MyISAM表尽量使用Char对于那些经常需要修改而容易形成碎片myisam和isam数据表就更是如此缺点就是占用磁盘空间

  对于InnoDB表数据行内部存储格式对固定长度数据行和可变长度数据行不加区分(所有数据行共用个表头部分这个标头部分存放着指向各有关数据列指针)所以使用char类型不见得会比使用varchar类型好事实上char类型通常要比varchar类型占用更多空间所以从减少空间占用量和减少磁盘i/o角度使用varchar类型反而更有利.

文章2:
应该是最常见种了但似乎各个数据库都有所区别比如oracle中就有啥varchar2的类不过mysql似乎最多还是集中在char和varchar上
说说区别char是固定长度而varchar会根据具体长度来使用存储空间比如char(255)和varchar(255)在存储串"hello world"时候char会用块255空间放那个11个而varchar就不会用255个他先计算长度后只用11个再加上计算串长度信息般1-2个这样varchar在存储不确定长度时候会大大减少存储空间

如此看来varchar比char聪明多了那char有用武的地吗?还是很不少优势

存储很短信息比如门牌号码101201……这样很短信息应该用charvarchar还要占个用于存储信息长度本来打算节约存储现在得不偿失

2固定长度比如使用uuid作为主键那用char应该更合适他固定长度varchar动态根据长度特性就消失了而且还要占个长度信息

3十分频繁改变columnvarchar每次存储都要有额外计算得到长度等工作如果个非常频繁改变那就要有很多精力用于计算而这些对于char来说是不需要


还有个有关varchar问题是varchar他既然可以自动适应存储空间那我varchar(8)和varchar(255)存储应该都是那每次表设计时候往大方向去好了免得以后不够用麻烦这个思路对吗?答案是否定mysql会把表信息放到内存中(查询第次后就缓存Cache住了linux下很明显但windows下似乎没有不知道为啥)这时内存申请是按照固定长度来如果varchar很大就会有问题所以还是应该按需索取

整理总结:仔细看DZ数据表定长字段基本还都是用char....
标签:
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: