本位基于MySQL5.7.24。CHAR和VARCHAR都可以用来表示字符类型,其不同在于两者的存储与检索、最大长度和尾部空格串的处理等方面。
1基础总结
下表是CHAR和CARCHAR的知识总结:
char与varchar的基础总结
以下几点需要特别引起注意:
1虽然在声明时,两种类型的m都可以指定为0,实际上最长长度为0只能存放空字符串。
2关于长度范围,CHAR在声明时,m只能是0~之间的数字;VARCHAR在声明时,m只能是0~范围的数字。
2存储
CHAR是定长字符串类型,在声明时指定其长度m,在进行数据写入时,如果写入的字符串未达到指定长度m,那么会在左侧使用空格补齐到长度m,所以,声明为m长度的CHAR类型,不论其存放的字符串长短,统一都会占用m字节。
VARCHAR是变长字符串类型,在声明时虽然指定其长度m,仅指其能存放字符串的最长长度,在存储时,如果存放的字符串长度不超过,VARCHAR会额外申请一个字节用于存放实际字符串的长度,如果超过,会额外申请两个字节的空间用于存放实际字符串的长度,所以根据VARCHAR实际存放的字符长度不同,其所占空间也会不同。例如在CHAR(4)和VARCHAR(4)中存放不同数据类型,其结果如下表所示:
char与varchar的存储
上表中最后一行,展示了当存储字符串超出其声明的最大长度时的提现,如果sql_mode未使用严格模式,则会如上表所示的样子,按最大长度截取,但是会产生警告;如果设置了严格模式,则会报错,如下图所示:
超长字符串的裁剪
Char类型的数据在存储时会自动裁剪右侧的空格串,而VARCHAR则不会,如下图所示:
右侧空格串的裁剪
为了使结果更明显,上图中使用concat对输出结果进行了调整,可以看到CHAR在存储时,自动裁剪了右侧的空格串。
3数据的校验
CHAR、VARCHAR(以及TEXT)类型在进行比较时,会自动裁剪后侧的空格串,然后进行比较,如下图所示:
字符串的校验1
对于此规则,如果在该类型的列上有唯一索引,那么插入裁剪右侧空格串后相同的字符串会报错。
如果需要将右侧的空格字符串参与比较,使用like即可,如下图所示:
字符串的比较校验2
4总结
本文总结梳理了MySQL数据库char与varchar类型的知识并给出了相应样例,在实际应用中如何选择合适的数据类型是非常重要的,其最重要的区别在于定长与变长,一般来说,能适用于char的地方varchar一定可以使用。
如提前知道需要存放的数据内容,如邮政编码、彩票号码等固定位数的字符串,则可以使用char类型,如不能确定长度的情况下,应该使用varchar。
在使用中药注意超过最大长度和不到最大长度时两种类型的不同处理。
对于字符串比较时的右侧空格串裁剪规则要引起注意,不同字符串因比较结果相同可能会引发不明显的错误结果。