前几日在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 字节。
除此之外,索引前缀长度还和 InnoDB 的 page size 有关。innodb_page_size 选项默认是 16KB 的时候,最长索引前缀长度是 3072 字节,如果是 8KB 的时候,最长索引前缀长度是 1536 字节,
默认是3KB的时候,是1024字节,默认是4KB 的时候,是 768 字节。
然后我们再查看先按选用的字符集的字节占用情况:
SHOW CHARACTER SET;
结果太多我就不贴执行结果的截图了。
如果表的字符集是 utf8mb4 时,一个字符将占用 4 个字节。这意味着索引前缀最大长度为 3072 字节时,只能容纳 3072 / 4 = 768 个字符;如果字符是utf8,一个字符将占用 3 个字节。这意味着索引前缀最大长度为 3072 字节时,只能容纳 3072 / 3 = 1024 个字符;其余字符集同理。
此时问题的解决方案只需要在建立索引时指定索引前缀长度:
CREATE INDEX idx_xxx ON table (columns(768) ASC);