mysql索引长度超过767bytes问题解决, Specified key was too long; max key length is 767 bytes

问题:

运行ddl创建表时报错, Specified key was too long; max key length is 767 bytes

原因:

msyql5.6及以前版本, 默认索引最大长度767bytes,若使用utf8mb4格式编码(utf8字符占用3字节,utf8mb4字符占用4字节), 则单个字段长度不能超过191, 5.7及之后版本, 限制放开到3072 bytes。

PS: 由于mysql的utf8编码并不是真正UTF-8,详细介绍请自行百度google,推荐使用utf8mb4,这个是通常所说的UTF-8。而utf8mb4的字符占用4字节,所以相较于utf8的占用3字节,更容易出现上面这种索引长度超限的问题。

在5.6及之前版本,若有索引超限的情况,可使用如下方法:

查看配置:

show variables like 'innodb_large_prefix';

show variables like 'innodb_file_format';

修改为如下配置:

set global innodb_large_prefix=1;

set global innodb_file_format=BARRACUDA;

 

建表时需要指定ROW_FORMAT为dynamic或compressed

eg:

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 '类名',

AUTO_ADD int(1) DEFAULT 1 COMMENT '是否自动添加',

UPDATE_TIME timestamp COMMENT '最后修改时间',

CREATE_TIME timestamp COMMENT '创建时间',

CREATED_BY varchar(50) NOT NULL COMMENT '操作人员名称',

UPDATED_BY varchar(50) NOT NULL COMMENT '操作人员名称',

PRIMARY KEY (`ID`),

UNIQUE (PKG_ID, CLASS_NAME)

) ENGINE=InnoDB ROW_FORMAT=dynamic DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

 

你可能感兴趣的:(数据库)