char与varchar详解

区别

varchar是变长字段,需要使用一个或两个字节存储长度(当允许存储的最大字节数MW(字符长度*每个字符需要的字节)大于255字节且真实字节数超过127字节时使用2字节,否则使用1字节),所以varchar也要按需分配

varchar会有内存碎片问题(比如把200长度更新为50),如果一个行占用的空间增长,并且在页内没有更多的空间可以存储,在这种情况下InnoDB需要分裂页来使行可以放进页内,这样会增加碎片。内存碎片容易造成空间浪费和磁盘IO读写性能下降,因为数据更加随机分散。

char的检索效率会更高

char尾部空格不会存储,不足长度会空格填充,检索的时候会调用trim删除尾部的空格

varchar尾部会存储空格,不足不会补空格

下面的表显示了将各种字符串值保存到CHAR(4)和VARCHAR(4)列后的结果,说明了CHAR和VARCHAR之间的差别:

char与varchar详解_第1张图片

请注意上表中最后一行的值只适用不使用严格模式时;如果MySQL运行在严格模式,超过列长度不的值不保存,并且会出现错误。

从CHAR(4)和VARCHAR(4)列检索的值并不总是相同,因为检索时从CHAR列删除了尾部的空格。通过下面的例子说明该差别:

mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));

mysql> INSERT INTO vc VALUES ('ab ', 'ab ');

mysql> SELECT CONCAT(v, ‘+’), CONCAT(c, ‘+’) FROM vc;

在这里插入图片描述

适用场景

CHAR适合存储很短的字符串,或者所有值都接近同一个长度。例如,CHAR非常适合存储密码的MD5值,因为这是一个定长的值。对于经常变更的数据,CHAR也比VARCHAR更好,因为定长的CHAR类型不容易产生碎片。对于非常短的列,CHAR比VARCHAR在存储空间上也更有效率。例如用CHAR(1)来存储只有Y和N的值,如果采用单字节字符集只需要一个字节,但是VARCHAR(1)却需要两个字节,因为还有一个记录长度的额外字节。

VARCHAR适合字符串很长或者所要存储的字符串长短不一,差别很大;字符串列的最大长度比平均长度大得多;列的更新很少,所以碎片不是问题。

你可能感兴趣的:(数据库,mysql,数据库)