创建前缀索引报长度超出错误
程序员文章站
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));
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));