MySQL异常:Index column size too large. The maximum column size is 767 bytes

问题描述

Mysql创建索引时报错:Index column size too large. The maximum column size is 767 bytes.

问题定位

异常指超出索引字节的限制,并不是指字段长度限制。MySQL对索引长度有限制:
1、针对某个索引,innodb引擎的每个索引列长度限制为767字节(bytes),所有索引列的长度和不能大于3072字节(bytes)。

建表时使用 utf8mb4 字符集,这是一个4 字节字符集。

当索引最大限制是 767 bytes时,那么一个 varchar 字段的字符集长度:767/4=191.75。

当 varchar 字段设置为默认的 255 长度,就超出了限制。

原SQL:

CREATE TABLE t_market_info (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
ad_id BIGINT(20) NOT NULL COMMENT '广告ID',
app_package VARCHAR(200) NOT NULL COMMENT '包名' COLLATE 'utf8mb4_general_ci',
begin_time DATETIME NOT NULL COMMENT '开始投放时间',
end_time DATETIME NULL DEFAULT NULL COMMENT '投放结束时间,null表示长期投放',
nation VARCHAR(100) NOT NULL COMMENT '国家' COLLATE 'utf8mb4_general_ci',
state TINYINT(1) NOT NULL COMMENT '-1删除 1生效;2失效',
create_time DATETIME NOT NULL COMMENT '创意时间',
update_time DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (id) USING BTREE,
UNIQUE INDEX uniq_ad_nation (ad_id, nation) USING BTREE,
INDEX idx_package_nation (app_package, nation) USING BTREE,
INDEX idx_state (state) USING BTREE
)
COMMENT='计划表'
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;

修改后SQL:

CREATE TABLE t_market_info (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
ad_id BIGINT(20) NOT NULL COMMENT '广告ID',
app_package VARCHAR(200) NOT NULL COMMENT '包名' COLLATE 'utf8mb4_general_ci',
begin_time DATETIME NOT NULL COMMENT '开始投放时间',
end_time DATETIME NULL DEFAULT NULL COMMENT '投放结束时间,null表示长期投放',
nation VARCHAR(100) NOT NULL COMMENT '国家' COLLATE 'utf8mb4_general_ci',
state TINYINT(1) NOT NULL COMMENT '-1删除 1生效;2失效',
create_time DATETIME NOT NULL COMMENT '创意时间',
update_time DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (id) USING BTREE,
UNIQUE INDEX uniq_ad_nation (ad_id, nation) USING BTREE,
INDEX idx_package_nation (app_package(191), nation) USING BTREE,
INDEX idx_state (state) USING BTREE
)
COMMENT='计划表'
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;

你可能感兴趣的:(MySQL异常:Index column size too large. The maximum column size is 767 bytes)