美文网首页mysql
MySQL 5.7 提示Specified key was to

MySQL 5.7 提示Specified key was to

作者: 风筝flying | 来源:发表于2022-06-02 09:56 被阅读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 字节。


    image.png

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


    image.png
    然后我们再查看先按选用的字符集的字节占用情况:
    SHOW CHARACTER SET;
    

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

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

    相关文章

      网友评论

        本文标题:MySQL 5.7 提示Specified key was to

        本文链接:https://www.haomeiwen.com/subject/qbxqmrtx.html