mysql致建表失败ERROR 1071 (42000) at line 5: Specified key was too long; max key length is 1536 bytes

一、数据库限制索引长度导致创建表失败

数据库信息:

数据库

版本

字符集

mysql

mysql5.7.28

utf8mb4

错误信息:

[root@rzx_uat_db_1 ~]# mysql -u root -S /tmp/mysql.sock1 --database=test< /root/quartz.sql
 
错误内容 ERROR 1071 (42000) at line 5: Specified key was too long; max key length is 1536 bytes

找到quartz.sql导致异常sql:

create table QRTZ_JOB_DETAILS (
sched_name varchar(120) not null, 
job_name varchar(200) not null, 
job_group varchar(200) not null,
description varchar(250) null, 
job_class_name varchar(250) not null, 
is_durable varchar(1) not null, 
is_nonconcurrent varchar(1) not null, 
is_update_data varchar(1) not null, 
requests_recovery varchar(1) not null, 
job_data blob null, 
primary key (sched_name,job_name,job_group) 
) engine=innodb;

过程分析:

根据字符集的不同,数据库字段占用的空间大小也不同,常用的字符集大小(x86系统):

字符集

占用空间大小

utf8mb4

1字符=4字节

utf8

1字符=3字节

gbk

1字符=2字节

导致错误为定于索引primary key (sched_name,job_name,job_group)的语句,这个语句的隐藏含义定义了索引的最大长度可为:(sched_name+job_name+job_group)*4byte=(120+200+200)*4=2080byte,根据错误提示,mysql5.7.28支持的最大索引长度为1536 bytes,所以执行语句时innodb层报错。

解决方案:

由于不能对数据库进行升级,只能调整字段长度,保证符合索引的最大长度小于阈值,修改后的sql。

create table QRTZ_JOB_DETAILS (
sched_name varchar(60) not null, 
job_name varchar(60) not null, 
job_group varchar(60) not null,
description varchar(250) null, 
job_class_name varchar(250) not null, 
is_durable varchar(1) not null, 
is_nonconcurrent varchar(1) not null, 
is_update_data varchar(1) not null, 
requests_recovery varchar(1) not null, 
job_data blob null, 
primary key (sched_name,job_name,job_group) 
) engine=innodb;

你可能感兴趣的:(MySQL)