Specified key was too long; max key length is 767 bytes

背景

从线上复制了一张表的表结构,打算在本地把该表创建出来,但是在执行时出现报错。之前这个报错也遇到过解决过,但是一段时间就忘记解决方案了,写篇文档记录下。

现象

MySQL版本:DBMS: MySQL (ver. 5.7.31-log)

表结构DDL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DROP table IF EXISTS t_record_log;
create table t_record_log
(
`id` BIGINT AUTO_INCREMENT NOT NULL COMMENT '自增ID',
`type` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '类型',
`code` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '标识',
`source_from` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '来源',
`status` int(1) NOT NULL DEFAULT 0,
PRIMARY KEY (id),
UNIQUE KEY uniq_source_type_code (`source_from`, `type`, `code`)
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8mb4
COLLATE utf8mb4_bin COMMENT '记录log';

执行后报错

1
[2023-01-17 15:29:31] [42000][1071] Specified key was too long; max key length is 767 bytes

报错原因

https://dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8mb4.html
1、库字符集COLLATE=utf8mb4_bin, 该表使用的字符集是COLLATE=utf8mb4_bin, CHARSET=utf8mb4,MySQL5.7官方文档说明 utf8mb4 使用4个字节,所以做索引的字段的做大长度应该是 767 / 4 = 191.75 -> 191,需要对上表的字段code和字段source_from修改一下长度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
create table t_record_log
(
`id` BIGINT AUTO_INCREMENT NOT NULL COMMENT '自增ID',
`type` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '类型',
`code` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '标识',
`source_from` VARCHAR(191) NOT NULL DEFAULT '' COMMENT '来源',
`status` int(1) NOT NULL DEFAULT 0,
PRIMARY KEY (id),
UNIQUE KEY uniq_source_type_code (`source_from`, `type`, `code`)
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8mb4
COLLATE utf8mb4_bin COMMENT '记录log';

DDL修改后,执行成功

拓展命令

1
2
3
4
5
show engines;

show character set;

show collation;

参考文章


Specified key was too long; max key length is 767 bytes
http://yoursite.com/2023/01/17/数据库/MySQL/Specified key was too long; max key length is 767 bytes/
作者
mohuani
发布于
2023年1月17日
许可协议