异常提示:#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在不同版本的数据库均能正常运行。