记录一次Specified key was too long的问题
环境
Mysql:5.7
编码集:utf8-mb4
行格式:Dynamic
Drds:5.4.5-15935842 和 5.4.9-16142062
现象
最近在工作中在测试环境DRDS上导出表结构语句,然后在正式环境执行语句报错
测试环境正常且在使用的表,在正式环境无法创建
建表时提示:Specified key was too long; max key length is 767 bytes .
建表语句示例:
CREATE TABLE `tb_200_test` (
`id` bigint(20) NOT NULL,
`test` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_200` (`test`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
;
总结:索引字段字段长度不能超过767byte
,innodb
在字符集编码规则 utf8
下字段长度下不能超过 767/3(255),utf8mb4
下不能超过767/4 (191),建表时utf8mb4
的字符集下varchar(200)
超过了191
所以创建失败
问题
1、从测试环境直接导出的建表语句为什么生产环境执行不了?
根本原因:innodb_large_prefix
参数测试和生产设置不一样,测试环境设置为ON
,正式环境设置为OFF
拓展
innodb_large_prefix参数是干什么的?version5.7
官方描述如下
1、启用此选项可为使用
DYNAMIC
或COMPRESSED
行格式的InnoDB
表允许大于767字节
(最多3072字节
)的索引键前缀。2、对于使用
REDUNDANT
或COMPACT
行格式的表,此选项不会影响允许的索引键前缀长度。注意:该参数是在
5.5
引入的,在5.5,5.6
版本中该参数默认为OFF
,在5.7
版本中才默认开启为ON
参考
https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html