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

Posted

技术标签:

【中文标题】SQL 错误 #1071 - 指定的键太长;最大密钥长度为 767 字节【英文标题】:SQL Error #1071 - Specified key was too long; max key length is 767 bytes 【发布时间】:2017-04-01 07:40:27 【问题描述】:
CREATE TABLE wp_locations (
        `id` INT(11) NOT NULL AUTO_INCREMENT,
        `city` VARCHAR(255) NOT NULL,
        `name` VARCHAR(255) NOT NULL,
        CONSTRAINT `city_name` UNIQUE (`city`, `name`)
    ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

我收到一个 sql 错误 '#1071 - 指定的键太长;最大密钥长度为 767 字节'

我做错了什么?

【问题讨论】:

您的组合密钥太长。制作单独的键或减少列长度 创建一个新列unique_id binary(16),连接两列,对它们进行哈希处理并将RAW哈希保存到unique_id,使unique_id唯一。工作完成。 【参考方案1】:

mysql 总是为 UTF8 字段保留 4 个字节的最大数量,因此 255 + 255 和您的 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;您已超过 767 的最大密钥长度限制。

您只能减少单个 varchar 长度或不使用复合键。

【讨论】:

这是问题所在,我将其更改为 varchar 128 并且有效 128 x 4 x 2 > 767 你应该再减少一次(试着告诉我) 但正如我所说,它可以工作,所以没有问题了 @PaulRoefs ops .. 对不起.. 我弄错了...好吧.. 很高兴你解决了问题【参考方案2】:

我也有同样的问题。我已将这些行添加到 /etc/my.conf.d 目录中名为 umb4-support.cnf 的新配置文件中

[mysqld]
innodb_large_prefix=true
innodb_file_format=barracuda
innodb_file_per_table=true

重新启动 maria db 服务后,我的导入脚本运行时没有出现此问题。 神速!

【讨论】:

这是解决方案 - 让数据库引擎接受更广泛的索引。接受的答案给出了问题的原因,但如果您需要复合键,则不是解决方案。这些设置对我有用。 innodb_file_format=Barracuda innodb_file_per_table=on innodb_default_row_format=dynamic innodb_large_prefix=1 innodb_file_format_max=Barracuda

以上是关于SQL 错误 #1071 - 指定的键太长;最大密钥长度为 767 字节的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 迁移错误:语法错误或访问冲突:1071 指定的键太长;最大密钥长度为 767 字节 laravel 5.3

MySQL - 错误 1071 阻止更改字符集/排序规则,“指定的键太长......”

语法错误或访问冲突:1071 指定的密钥太长;最大密钥长度为 767 字节 [重复]

Mysql Entity Framework 问题 - 指定的键太长;最大密钥长度为 3072 字节

Mysql::Error: 指定的键太长;最大密钥长度为 1000 字节

UNIQUE INDEX - 指定的键太长;最大密钥长度为 767 字节 [重复]