今天在给一列建唯一索引的时候,提示
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!