mysql中char和varchar的区别

     数据库中用的最多的还要数字符的操作的了,mysql中两个比较重要的数据类型:char 和varchar,两者在使用的时候还是有区别的:

1、首先,char型的数据是定长度的,当我们定义一个数据类型时:name char(5) ,表示name这个变量时刻是占用5个字节,但如果我们用name varchar(5) 来定义是表示最大长度为5,但实际可能占用不到这么多,因此varchar相对于char来说是比较省内存的;

  总结:char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节)。注意,插入数据都不能超过其长度(如果超出范围的是一个空格,则只会给出一个警告,最后的空格会被截断,但插入操作成功执行!)。

2、空格的省略问题:

create table cus (cust_name char(5),cust_city varchar(5));
insert into cus values('a ','a ');  //注意插入的字符后面都加有空格
selsect * from cus;   //执行结果两者相等
select concat(cust_name,'+') as name ,concat(cust_city,'+') as city from cus;

执行上面最后的语句可以得到如下的结果:


可以看出,cha型的数据在输出的时候会把最后的空格删除,而varchar不会删除末尾的空格。


3、char 和varchar 的选择问题

   既然相同长度的char(m)比varchar(m)占用更多的内存,是不是我就可以任意字符数据都设置为varchar类型,并把m设为最大值(mysql 5.0 以后varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字 节),这样是不明智的;

一、对于MyISAM表,尽量使用Char,对于那些经常需要修改而容易形成碎片的myisam和isam数据表就更是如此,它的缺点就是占用磁盘空间; 对于InnoDB表,因为它的数据行内部存储格式对固定长度的数据行和可变长度的数据行不加区分(所有数据行共用一个表头部分,这个标头部分存放着指向各有关数据列的指针),所以使用char类型不见得会比使用varchar类型好。事实上,因为char类型通常要比varchar类型占用更多的空间,所以从减少空间占用量和减少磁盘i/o的角度,使用varchar类型反而更有利。

二、存储很短的信息,比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占个byte用于存储信息长度,本来打算节约存储的现在得不偿失。

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

四、十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。

五、mysql会把表信息放到内存中(查询第一次后,就缓存住了,linux下很明显,但windows下似乎没有,不知道为啥),这时内存的申请是按照固定长度来的,如果varchar很大就会有问题。所以那每次表设计的时候往大的方向去好了,免得以后不够用麻烦。这个思路是不对的,还是应该按需索取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值