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

内容分享22小时前发布
0 0 0

问题描述

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
;

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...