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 字节