mysql索引长度超过767bytes问题解决。Specified key was too long; max key length is 767 bytes
错误信息:
Specified key was too long; max key length is 767 bytes
MySQL的InnoDB存储引擎的表存在一系列的限制条件,其中比较常见的一种是表的字段索引长度限制,该限制与参数innodb_large_prefix相关。
原因分析:
导致上面报错的原因是由于InnoDB表的索引长度限制,在MySQL5.6版本后引入了参数innodb_large_prefix可以解决这个问题。该参数控制是否允许单列的索引长度超过767字节,有ON和OFF两个取值:
:Innodb表的行记录格式是Dynamic或Compressed的前提下,单列索引长度上限扩展到3072个字节。
:Innodb表的单例索引长度最多为767个字节,索引长度超出后,主键索引会创建失败,辅助索引会被截断成为前缀索引。
解决办法:
设置MySQL的全局参数innodb_large_prefix=ON,将InnoDB表的索引长度上限扩大到3072个字节。
MySQL5.6以及之前版本
以及之后的版本,不包括8.0,默认innodb_large_prefix为开启状态。
版本以及之后版本直接看到 4 ,5步骤
1. 查看MySQL数据库当前的配置;
2. show variables like 'innodb_large_prefix';
show variables like 'innodb_file_format';
2 修改配置
set global innodb_large_prefix=ON;//开启不限制索引长度
set global innodb_file_format=BARRACUDA;//这个不知道
3.建表时需要指定ROW_FORMAT为dynamic或compressed
CREATE TABLE IMPORTS(
`ID` int(10) NOT NULL AUTO_INCREMENT COMMENT '资产ID',
PKG_ID int(10) NOT NULL COMMENT '资产ID',
CLASS_NAME varchar(255) NOT NULL COMMENT '类名',
) ENGINE=InnoDB ROW_FORMAT=dynamic DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4.表已经存在,只需修改。
ALTER TABLE `TableName ` row_format=dynamic;