内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
当我执行以下命令时:
ALTER TABLE `mytable` ADD UNIQUE ( `column1` , `column2` );
我收到了一条错误消息:
#1071 - Specified key was too long; max key length is 767 bytes
关于第1栏和第2栏的信息:
column1 varchar(20) utf8_general_ci column2 varchar(500) utf8_general_ci
我认为……varchar(20)
只需要21个字节varchar(500)
只需要501字节。所以总字节是522,小于767。那么为什么我会收到错误信息呢?
#1071 - Specified key was too long; max key length is 767 bytes
767字节是MySQLVersion 5.6和InnoDB表(和以前的版本)的限制长度。MyISAM表的长度为1000字节。在MySQLVersion 5.7及以上版本中,这个限制已经增加到3072字节。
如果你在一个大char或varchar字段上设置了一个索引,该字段是utf8mb4编码的,则必须将最大索引前缀长度767字节(或3072字节)除以4,结果为191字节。这是因为utf8mb4字符的最大长度是4个字节。对于UTF 8字符,它将是三个字节,导致最大索引前缀长度为254。
您可以选择只对VARCHAR字段设置下限。
另一个选项(根据对这一问题的回应)是获取列的子集
ALTER TABLE `mytable` ADD UNIQUE ( column1(15), column2(200) );
当需要进行调整,以获得应用程序的关键,可以对数据模型进行检查,以查看是否有改进。