问题处理:Column length too big for column 'Flist' (max = 21845);

我们都知道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。