在MySQL建表sql里,我们经常会有定义字符串类型的需求。
CREATE TABLE `user` (
`name` varchar(100) NOT NULL DEFAULT '' COMMENT '名字'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ;
比方说user表里的名字,就是个字符串。MySQL里有两个类型比较适合这个场景。
char和varchar。
声明它们都需要在字段边上加个数组,比如char(100)和varchar(100),这个100是指当前字段能放的最大字符数。
char和varchar的区别在于,varchar虽然声明了最大能放100个字符,但一开始不需要分配100个字符的空间,可以根据需要慢慢增加空间。而char一开始声明是多少,就固定预留多少空间。
所以,varchar比起char更省空间,一般没啥大事,大家都爱用varchar。
那问题来了,声明varchar字段时,它的最大长度是多少呢?
相信大家应该听说过varchar字段的最大长度是65535吧,没听过也没关系,你现在听到了。
但实际上是这样吗?我们来做个实验。
一、varchar最大值是多少
我们直接拿65535来试一下。
长度为65535的varchar报错
很明显报错了。报错内容也说了, 由于列长度过大导致报错,最长是16383。
把上面的65535改成 16383,确实是成功了。
哦?所以说varchar最大值是16383?
当然不是,这其实还有好几个因素影响这个最大值。
二、不同字符集的影响
varchar里放的是字符串,而字符串看起来可以是英文字母,也可以是数字或中文。但不管怎么样,都可以把这样的中英文数字转成二进制的01串。
按照一定规则把符号和二进制码对应起来,这就是编码。而把n多这种已经编码的字符聚在一起,就是我们常说的字符集。
建表语句里有个CHARSET,这里填的是字符集。
不同的字符集要求使用的字节个数也不同,我们可以通过 show charset; 看到mysql支持哪些字符集,以及这些字符集里存储一个字符所需的最大字节数(Maxlen)。
查看mysql支持哪些charset
我们尝试下把建表sql语句里的CHARSET改一改,比如改成utf8mb3。
我们再执