mysql在创建数据库的时候,字符集设置的不是utf8而是utf9mb4,在导入sql脚本的时候,发现提示如下错误:
从上图中,我们可以看出,使用的是innodb及字符集。错误提示是长度太长了:Specifiedkeywastoolong;maxkeylengthisbytes
来查看下创建表的语句:
CREATETABLE`xxl_job_registry`(
`id`int(11)NOTNULLAUTO_INCREMENT,
`registry_group`varchar(50)NOTNULL,
`registry_key`varchar()NOTNULL,
`registry_value`varchar()NOTNULL,
`update_time`datetimeDEFAULTNULL,
PRIMARYKEY(`id`),
KEY`i_g_k_v`(`registry_group`,`registry_key`,`registry_value`)
)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;
varchar的长度明明设置的是啊。怎么会报出bytes的错误呢?
我们在看看错误提示:
[Err]-Specifiedkeywastoolong;maxkeylengthisbytes。
这个就是因为联合所以长度限制的。
我们来看看MySqlInnoDB引擎对索引长度的限制:
mysql单索引限制:
在默认情况下,InnoDB对单一的字段索引长度限制最大为个字节。
这个长度怎么来的呢?当mysql创建数据库的时候,字符集使用的是UTF-8的时候,我们知道UTF-8每个字符使用三个字节来存储的。即:*3-1=了。这个字符大小的限制就是从这里来的。
联合索引(前缀索引)限制:
同样的,mysql对前缀索引也有同样的限制。根据字符集不同,长度限制也不同。
字符集使用utf8的时候长度限制是:个
使用uft8mb4的时候长度限制是:个
但是,在文章一开始,凯哥就强调了,凯哥数据库使用的字符集是:utf8mb4。我们也知道,utf8mb4编码的每个字符使用四个字节来存储的。我们来计算下:*4-1。
从凯哥的sql脚本可以看出:KEY`i_g_k_v`(`registry_group`,`registry_key`,`registry_value`)使用到了联合索引(前缀索引)。
随意凯哥数据库的字符集使用的不是utf8,但是mysql系统变量innodb_large_prefix未开启(因为凯哥使用的是默认配置)。如果系统变量innodb_large_prefix开启了,就会对使用dynamic或者是