问题:
运行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;