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

标签 mysql byte varchar mysql-error-1071

当我执行以下命令时:

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

最佳答案

在 MySQL 5.6 版(及之前的版本)中为 767 字节,是 stated prefix limitation对于 InnoDB 表。 MyISAM 表的长度为 1,000 字节。在 MySQL 5.7 版(及更高版本)中,此限制已增加到 3072 字节。

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

您的一个选择是在您的 VARCHAR 字段上设置下限。

另一种选择(根据 response to this issue )是获取列的子集而不是全部,即:

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

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

关于MySQL 错误 #1071 - 指定的 key 太长;最大 key 长度为 767 字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47570131/

相关文章:

php - 如何设计静态/动态测量应用程序?

c# - 了解 C# 中的十六进制和字节

Java-将缓冲图像转换为字节[]而不写入磁盘

sql - postgres 选择在 varchar[] 列中具有任何列表字符串的所有行

php - 解析哪个数据类型

MySQL - 在 varchar 中存储长度为 1000

php - 当限制达到 4 时更改 SQL 查询

php - Doctrine2 一对多/多对一关系给出重复记录

php - Doctrine2 - 从没有直接关系的多个表中选择

php - Windows Phone中上传图片和php POST方法