记录一次Specified key was too long的问题

记录一次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  
;

总结:索引字段字段长度不能超过767byteinnodb 在字符集编码规则 utf8下字段长度下不能超过 767/3(255),utf8mb4下不能超过767/4 (191),建表时utf8mb4的字符集下varchar(200)超过了191所以创建失败

问题

1、从测试环境直接导出的建表语句为什么生产环境执行不了?
根本原因:innodb_large_prefix 参数测试和生产设置不一样,测试环境设置为ON,正式环境设置为OFF

在这里插入图片描述

在这里插入图片描述

拓展

innodb_large_prefix参数是干什么的?version5.7官方描述如下

在这里插入图片描述

1、启用此选项可为使用DYNAMICCOMPRESSED行格式的InnoDB表允许大于767字节(最多3072字节)的索引键前缀。
2、对于使用REDUNDANTCOMPACT行格式的表,此选项不会影响允许的索引键前缀长度。
注意:该参数是在5.5引入的,在5.5,5.6版本中该参数默认为OFF,在5.7版本中才默认开启为ON

参考

https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html

你可能感兴趣的:(记录一次Specified key was too long的问题)