欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

创建前缀索引报长度超出错误

程序员文章站 2022-05-26 23:17:11
...
表结构定义如下:
CREATE TABLE `sku` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键' ,
`sku_code` VARCHAR(20) NOT NULL COMMENT '商品编码' ,
`version` BIGINT UNSIGNED NOT NULL COMMENT '商品信息版本,初始值1,每修改一次版本值增加1' ,
`sku_name` VARCHAR(200) NOT NULL COMMENT '商品名称' ,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_idx_sku_code_version` (`sku_code`,`version`) USING BTREE
)
  ENGINE = InnoDB
  DEFAULT CHARACTER SET=utf8mb4 COLLATE=utf8mb4_general_ci;

执行
create index idx_sku_name on msm_sku(sku_name);然后发现报如下错误

Error: Specified key was too long; max key length is 767 bytes
SQLState:  42000
ErrorCode: 1071

2个问题?
1)为什么报too long 错误?
2)为什么 max key length is 767 bytes,767怎么来的?


回答:
1)报too long的错误,是因为utm8mb4编码格式下,一个汉字占4个字节,由于定义的是varchar(200),所以最大字节数=200*4 = 800 > 767,所以报too long 错误

2)why 767?
这就是mysql在某个引擎某个编码下对索引长度有最大限制。参见
mysql 索引长度限制详解
https://blog.csdn.net/guyan0319/article/details/79715761

解决方案:
建立前缀索引,即建索引时指定字符长度
create index idx_sku_name on sku(sku_name(50));
或者
ALTER TABLE `sku`
ADD INDEX idx_sku_name (sku_name(50));