【问题标题】:SQL Error #1071 - Specified key was too long; max key length is 767 bytesSQL 错误 #1071 - 指定的键太长;最大密钥长度为 767 字节
【发布时间】: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唯一。工作完成。

标签: mysql


【解决方案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
猜你喜欢
  • 2015-06-22
  • 2013-12-21
  • 2015-06-29
  • 2016-10-04
  • 2014-08-17
  • 2017-03-13
  • 1970-01-01
  • 2016-04-15
  • 2012-05-31
相关资源
最近更新 更多