今天在给一列建唯一索引的时候,提示

1071 -Specified key was too long; max key length is 3072 bytes

我的第一反应是去看对应列的数据,都是最多七八个字的中文,然后看到对应列的类型,是varchar(2056), 由此想到varchar的长度到底跟字节是什么关系。

英文字母和中文汉字在不同字符集编码下的字节数

英文字母

字节数 : 1;编码:GB2312

字节数 : 1;编码:GBK

字节数 : 1;编码:GB18030

字节数 : 1;编码:ISO-8859-1

字节数 : 1;编码:UTF-8

字节数 : 4;编码:UTF-16

字节数 : 2;编码:UTF-16BE

字节数 : 2;编码:UTF-16LE

中文汉字

字节数 : 2;编码:GB2312

字节数 : 2;编码:GBK

字节数 : 2;编码:GB18030

字节数 : 1;编码:ISO-8859-1

字节数 : 3;编码:UTF-8

字节数 : 4;编码:UTF-16

字节数 : 2;编码:UTF-16BE

字节数 : 2;编码:UTF-16LE

计算varchar(n)最多存储多少字节的内容

varchar(n)能存储n个字符,不管是数字,字母还是汉字,那么根据不同编码最大占用的字节数为4,最大占用n*4个字节。
所以唯一索引要求key值长度不能超过3072,如果列类型是varchar,那么3072/4=768, 作为唯一索引的varchar列的长度最多为768!