MySQL5.6索引长度超长 #1071 - Specified key was too long; max key length is 7

105 阅读2分钟

异常提示:#1071 - Specified key was too long; max key length is 767 bytes

在MySQL 5.6及之前的版本,使用InnoDB作引擎的表的索引大小要小于767B 否则会报错

1.字符长度与字节长度换算关系

在上面字段字符长度为200,那么一个字符长度对应的字节长度关系如下:

以 ``utf8mb4字符集为例(不同字符集占用字节长度不同):

  • 大部分常用的中文字符、英文字符通常占用3个字节。
  • 英文(包括英文字符)通常占用1个字节。
  • emoji表情符号等补充字符会占用4个字节。

那么以最长的长度算 200 * 4 = 800 > 767(数据库限制的字节长度) 就会报错。

2.解决办法:

(1)可在 my.cnf 中配置(不建议,有其他解决方式一般不会去动配置文件中的内容)

        default-storage-engine=INNODB

        innodb_large_prefix=on

(2)修改字段长度(不建议,可能会导致插入数据超长引起报错从而影响业务)

    source_expense_no varchar(200) -->    source_expense_no varchar(150)  

(3)修改索引长度(建议,绝大多数数据占用的长度不会占满,截取大部分长度建立索引影响查询速度概率较小)

       

3.其它注意事项( SELECT version() 查询MySQL数据库版本号

  高版本的数据库做了很多优化,很多SQL在高版本数据库可以执行,在低版本执行报错。

  例如一次补丁需求中,去除了额外查询条件,子查询的括弧未去除,双括弧在内网补丁环境MySQL8.0正常执行,发布线上MySQL5.6执行报错。

 

每个迭代的升级脚本(或补丁需求的SQL)一定要在低版本的数据库执行一遍。这样确保SQL在不同版本的数据库均能正常运行。