小编典典

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

all

当我执行以下命令时:

ALTER TABLE `mytable` ADD UNIQUE (
`column1` ,
`column2`
);

我收到此错误消息:

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

关于 column1 和 column2 的信息:

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

阅读 182

收藏
2022-03-04

共1个答案

小编典典

*MySQL 5.6 版(和之前的版本)中的 *767 字节是 InnoDB 表的
规定前缀限制
。MyISAM 表的长度为
1,000 字节。 在 MySQL 5.7 版 (及更高版本)中,此限制已增加到3072 字节。

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

您可以选择的一种选择是对您的VARCHAR字段设置下限。

另一种选择(根据对这个问题的回应)是获取列的子集而不是整个数量,即:

ALTER TABLE `mytable` ADD UNIQUE ( column1(15), column2(200) );

根据需要进行调整以获取应用密钥,但我想知道是否值得审查有关此实体的数据模型以查看是否有可能进行改进,这将允许您在不影响 MySQL
限制的情况下实施预期的业务规则.

2022-03-04