Mysql之char和varchar的区别

varchar
1、使用比固定长度类型(char)占用更少存储空间(除了使用ROW_FORMAT=FIXED创建的MyISAM表)
2、使用额外的1-2字节来存储值长度,列长度<=255使用1字节保存,其它情况使用2字节保存。例如varchar(10)会占用11字节存储空间,varchar(500)会占用502字节存储空间
3、节约空间,所以性能会有帮助。在更新的时候会产生额外的工作。
4、5.0以上版本,取值或设置值都会保存字符串末尾的空格,4.1之前的版本都会把字符串末尾的空格删除掉
5、最大长度远大于平均长度,很少发生更新的时候适合使用varchar,因为减少使用空间,效率提高,碎片更少了

char
1、使用固定长度
2、保存的时候会去掉字符串末尾的空格

3、适合保存MD5后的哈希值或经常改变的值,因为固定的行不容易产生碎片


关于是否去掉字符串末尾的空格

注意所有MySQL校对规则属于PADSPACE类。这说明在MySQL中的所有CHAR和VARCHAR值比较时不需要考虑任何尾部空格。例如: 

mysql> CREATE TABLE names (myname CHAR(10), yourname VARCHAR(10)); 
Query OK, 0 rows affected (0.09 sec) 

mysql> INSERT INTO names VALUES ('Monty ', 'Monty '); 
Query OK, 1 row affected (0.00 sec) 

mysql> SELECT myname = 'Monty  ', yourname = 'Monty  ' FROM names; 
+--------------------+----------------------+ 
| myname = 'Monty  ' | yourname = 'Monty  ' | 
+--------------------+----------------------+ 
|                  1 |                    1 | 
+--------------------+----------------------+ 
1 row in set (0.00 sec) 
请注意所有MySQL版本均如此,并且它不受SQL服务器模式的影响。 

对于尾部填充字符被裁剪掉或比较时将它们忽视掉的情形,如果列的索引需要唯一的值,在列内插入一个只是填充字符数不同的值将会造成复制键值错误。 

CHAR BYTE是CHAR BINARY的别名。这是为了保证兼容性。 

ASCII属性为CHAR列分配latin1字符集。UNICODE属性分配ucs2字符集。

对于varchar列来说,SQL模式在启用的时候,大量的尾部空格在插入之前都会被截短,产生一个警告。对于char列来说,不管SQL模式是否被启用,都会静默地去掉插入值的过量的尾部空格

    varchar值存储的时候是不会填充的。如何处理尾部空格,取决于版本。在MySQL5.0.3中,当值存储和检索的时候,保留尾部空格,和标准的SQL保持一致。在MySQL5.0.3之前,值被保存到varchar列的时候,尾部空格会被剔除。这样也就意味着检索值的时候,也不存在这些空格。

    在MySQL5.0.3之前,如果你需要一个不去掉尾部空格的数据类型的时候,要考虑BLOB或者TEXT类型。同样当你存储加密数据或者压缩数据的时候,也要使用BLOB列,而不是char或者varchar列,来避免需要改变值的时候,尾部空格的潜在问题。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值