MySQL 5.7 提示Specified key was too long; max key length is XXX bytes问题详解

内容分享2小时前发布
0 0 0

前几日在MySQL执行一条update语句时报错,报错信息如下:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 
Specified key was too long; max key length is 1024 bytes

通过搜索查到有许多类似的报错例子,区别只是在于有的是3072 bytes,有的是768bytes,于是总结了此类问题出现的缘由和解决方案。
出现此类问题的缘由都是在于InnoDB 表引擎的限制,默认情况下,索引前缀长度限制为 767 字节,当开启了 innodb_large_prefix 选项时,索引前缀长度扩展到 3072 字节。

MySQL 5.7 提示Specified key was too long; max key length is XXX bytes问题详解

除此之外,索引前缀长度还和 InnoDB 的 page size 有关。innodb_page_size 选项默认是 16KB 的时候,最长索引前缀长度是 3072 字节,如果是 8KB 的时候,最长索引前缀长度是 1536 字节,
默认是3KB的时候,是1024字节,默认是4KB 的时候,是 768 字节。

MySQL 5.7 提示Specified key was too long; max key length is XXX bytes问题详解

然后我们再查看先按选用的字符集的字节占用情况:

SHOW CHARACTER SET;

结果太多我就不贴执行结果的截图了。
如果表的字符集是 utf8mb4 时,一个字符将占用 4 个字节。这意味着索引前缀最大长度为 3072 字节时,只能容纳 3072 / 4 = 768 个字符;如果字符是utf8,一个字符将占用 3 个字节。这意味着索引前缀最大长度为 3072 字节时,只能容纳 3072 / 3 = 1024 个字符;其余字符集同理。
此时问题的解决方案只需要在建立索引时指定索引前缀长度:

CREATE INDEX idx_xxx ON table (columns(768) ASC);

© 版权声明

相关文章

暂无评论

none
暂无评论...