MySQL错误#1071-指定的密钥太长;最大密钥长度为767字节

当我执行以下命令时:

ALTER TABLE`mytable`ADD UNIQUE(
`第1栏`,
`专栏2`
);

我收到了以下错误消息:

#1071-指定的密钥太长;最大密钥长度为767字节

关于第1列和第2列的信息:

第1列varchar(20)utf8\u常规\u ci
第2列varchar(500)utf8\u常规\u ci

我认为varchar(20)只需要21个字节,而varchar(500)只需要501个字节。所以总字节数是522,少于767。那我为什么会收到错误信息呢

#1071-指定的密钥太长;最大密钥长度为767字节

767字节是MySQL版本5.6(及更早版本)中InnoDB表的前缀限制。MyISAM表的长度为1000字节。在MySQL版本5.7及更高版本中,此限制已增加到3072字节

您还必须注意,如果在utf8mb4编码的大字符或varchar字段上设置索引,则必须将767字节(或3072字节)的最大索引前缀长度除以4,从而得到191。这是因为utf8mb4字符的最大长度为四个字节。对于utf8字符,它将是三个字节,导致最大索引前缀长度为254

一种选择是只对VARCHAR字段设置下限

另一种选择(根据对此问题的回复)是获取列的子集,而不是整个金额,即:

ALTER TABLE`mytable`ADD UNIQUE(第1(15)列、第2(200)列);

根据需要进行调整以获得要应用的密钥,但我想知道是否值得检查您关于该实体的数据模型,以查看是否有改进可以让您在不违反MySQL限制的情况下实现预期的业务规则

发表评论