数据库
首页 > 数据库> > mysql 索引过长1071-max key length is 767 byte

mysql 索引过长1071-max key length is 767 byte

作者:互联网

问题
由于系统需要,吧mysql数据库字符集由utf-8转换成utf-8mb4.
mysql数据库中存在数据,那么不能直接用命令修改字符集,如果直接修改,只会对新创建的表或记录有效,原有数据还是之前的字符集。具体如下

导出存储sql(结构和数据)
替换存储sql中建表内容

CHARSET=utf8 =》CHARSET=utf8mb4
COLLATE utf8_unicode_ci =》COLLATE utf8mb4_unicode_ci
COLLATE=utf8_unicode_ci =》COLLATE=utf8mb4_unicode_ci

运修改后的行存储sql
出现问题:

create table: Specified key was too long; max key length is 767 bytes


数据库表采用utf8mb4编码,其中部分表需要创建索引、外键。而mysql默认情况下单个列的索引不能超过767位(不同版本可能存在差异),于是utf8mb4字符编码下,255*3 byte 超过限制。

 

 

如果启用了系统变量innodb_large_prefix(默认启用,注意实验版本为MySQL 5.6.41,默认是关闭的,MySQL 5.7默认开启),则对于使用DYNAMIC或COMPRESSED行格式的InnoDB表,索引键前缀限制为3072字节。如果禁用innodb_large_prefix,则对于任何行格式的表,索引键前缀限制为767字节。

innodb_large_prefix将在以后的版本中删除、弃用。在MySQL 5.5中引入了innodb_large_prefix,用来禁用大型前缀索引,以便与不支持大索引键前缀的早期版本的InnoDB兼容。

对于使用REDUNDANT或COMPACT行格式的InnoDB表,索引键前缀长度限制为767字节。例如,您可能会在TEXT或VARCHAR列上使用超过255个字符的列前缀索引达到此限制,假设为utf8mb4字符集,并且每个字符最多包含4个字节。

尝试使用超出限制的索引键前缀长度会返回以上错误。要避免复制配置中出现此类错误,请避免在主服务器上启用enableinnodb_large_prefix(如果无法在从服务器上启用)。通常索引的长度不应太长,会影响检索效率。

注意:上面是767个字节,而不是字符,具体到字符数量,这就跟字符集有关。GBK是双字节的,UTF-8是三字节的

解决方法:

查看并修改当前数据库innodb_large_prefix参数的值

show variables like '%innodb_large_prefix%';
set global innodb_large_prefix=on;

我在执行到这一步是就已经ok了

类似的还有innodb_file_format数据库参数,用于控制column size大小
修改ROW_FORMAT为DYNAMIC或COMPRESSED

标签:字节,max,767,1071,large,索引,prefix,innodb,前缀
来源: https://www.cnblogs.com/xzlive/p/16350239.html