最近在学习使用若依框架,在创建数据库表时遇到这个错误:1071 - Specified key was too long; max key length is 767 bytes
原因分析:
1.前提情况;
(什么是sql的文件?顾名思义,就是其中编写了大量的sql语句的一种文件,我们称为这样的文件为sql脚本。当它运行时,会执行其中的sql语句完成对应的工作,例如创建表,查询等)
我是导入现成的.sql文件去创建数据库,如图:
下面是产生问题的sql语句:
create table QRTZ_JOB_DETAILS02 (
sched_name varchar(120) not null comment '调度名称',
job_name varchar(200) not null comment '任务名称',
job_group varchar(200) not null comment '任务组名',
description varchar(250) null comment '相关介绍',
job_class_name varchar(250) not null comment '执行任务类名称',
is_durable varchar(1) not null comment '是否持久化',
is_nonconcurrent varchar(1) not null comment '是否并发',
is_update_data varchar(1) not null comment '是否更新数据',
requests_recovery varchar(1) not null comment '是否接受恢复执行',
job_data blob null comment '存放持久化job对象',
primary key (sched_name, job_name, job_group)
) engine=innodb comment = '任务详细信息表';
2.错误原因
由于MySQL使用的InnoDB存储引擎有一个长度的限制(主键或唯一键的最大字节数不超过767个字节),在创建表时主键字符长度的限制会基于字符集的不同而不同。例如:
在创建数据库时:
- 若使用
utf8
字符集,每个字符可能占用3
个字节,那么对于innodb
表,索引键的最大长度大约为256
个字符(因为768 / 3 ≈ 256
)。 - 若使用的字符集是
utf8mb4
,每个字符可能占用4
个字节,所以最大长度会进一步减少到192
个字符(768/ 4 = 192
)
1071 - Specified key was too long; max key length is 767 bytes
从描述上来看,是Key
太长,超过了指定的 768
字节限制。该错误通常出现在尝试创建一个过长的唯一键(UNIQUE KEY
)或主键(PRIMARY KEY
)时;
由于我用的字符集是utf8mb4,并且
sql语句中设定主键的value值的长度为250(varchar),250*4=1000>767;所以才会报这个错误。
3.解决方案:
(1)缩短索引的varchar字符长度
修改索引的varchar字符,若使用的是utf8mb4
字符集:要让字符长度 * 4 < 768即可,
若使用的是utf8
字符集:只要让字符长度 * 3 < 768即可,
但是有时某个字段的字符数是必须要足够大的才能满足需求,这时候还有第二种方式。
(2)修改最大索引长度限制
①首先输入sql语句:
// 查看最大索引状态是0ff关闭
show variables like "innodb_large_prefix";
show variables like "innodb_file_format";
输出结果:我们看到状态是OFF(关闭)
②输入下面sql语句后,即可解除限制:
//修改最大索引长度限制
set global innodb_large_prefix=1;
或者:
set global innodb_large_prefix=on;
set global innodb_file_format=BARRACUDA;
希望对大家有所帮助!
#参考文章:
mysql索引过长Specialed key was too long的解决方法_mysql指定的key太长-CSDN博客