1071: Specified key was too long; max key length is 767 bytes(指定的键过长;最大键长度为 767 字节)
MySQL含义
要创建的索引(或键)超出了允许的最大字节长度。尤其在多字节字符集下,VARCHAR 索引很快就会达到此限制。
原因
在 utf8mb4(每字符 4 字节)的宽 VARCHAR 列上建索引;旧的 InnoDB 行格式(REDUNDANT/COMPACT;在 5.7 及更早版本中还包括禁用的 innodb_large_prefix);多列复合索引的总长度超过限制;主键过大。
解决方法
缩短被索引列的长度或使用前缀索引:CREATE INDEX idx ON my_table (my_column(191)); 使用 DYNAMIC/COMPRESSED 行格式以获得 3072 字节的限制(DYNAMIC 是 MySQL 8.0 的默认值;innodb_large_prefix 已在 8.0 中移除,仅在 5.7 及更早版本中需要)。必要时检查列的字符集/长度。
同一数据库的其他条目
- 1048Column 'x' cannot be null(列 'x' 不能为 null)
- 1292Incorrect datetime value / truncated incorrect value(日期时间值不正确 / 截断了不正确的值)
- 1406Data too long for column(列的数据过长)
- 1050Table already exists(表已存在)
- 1051Unknown table 'x'(未知表 'x')
- 1091Can't DROP 'x'; check that column/key exists(无法 DROP 'x';请检查该列/键是否存在)
- 1093You can't specify target table 'x' for update in FROM clause(不能在 FROM 子句中指定要更新的目标表 'x')