mysql使用联合索引提示字符长度超限制

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或者是


转载请注明:http://www.aierlanlan.com/rzgz/3337.html

  • 上一篇文章:
  •   
  • 下一篇文章: