我们都知道mysql建表的时候列长度有65535的限制,但是这个单位是字节, 不同字符集下每个字符占用的字节数不同,utf8下每个字符占用3个字节(65535/3=21845),gbk下每个字符占用2个字节(65535/2=32767),latin1字符集下一个字符占用一个字节。但一般情况下我们都是用utf8bm4,
MySQL4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) max varchar(65536)
MySQL5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节)max varchar(21845)
查看MySQL版本:
查看MySQL存储引擎
那varchar(21845)应该是varchar的最大值了
但是varchar (21845)修改保存的时候报错了
ERROR 1071 (42000) : Specified key was too long; max key length is 3072 bytes
这个报错的意思是:指定密钥太长;最大密钥长度为3072字节
这跟 系统变量innodb_large_prefix(默认启用,注意实验版本为MySQL 5.6.41,默认是关闭的,MySQL 5.7默认开启)有关,则对于使用DYNAMIC或COMPRESSED行格式的InnoDB表,索引键前缀限制为3072字节。如果禁用innodb_large_prefix,则对于任何行格式的表,索引键前缀限制为767字节。
3072/3=1024
varchar(1024),保存成功。【utf8】
varchar(768),保存成功。【utf8bm4】 mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。