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

本文详细介绍了如何将MySQL数据库的字符集从utf-8平滑迁移至utf-8mb4,以及在迁移过程中可能遇到的索引长度限制问题的解决方案。包括修改innodb_large_prefix参数和调整ROW_FORMAT等技巧。

问题

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

  1. 导出存储sql(结构和数据)
  2. 替换存储sql中建表内容
    CHARSET=utf8 =》CHARSET=utf8mb4
    COLLATE utf8_unicode_ci =》COLLATE utf8mb4_unicode_ci
    COLLATE=utf8_unicode_ci =》COLLATE=utf8mb4_unicode_ci
  3. 运修改后的行存储sql
    出现问题:
    create table: Specified key was too long; max key length is 767 bytes

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

在这里插入图片描述

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

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

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

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

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

解决方法:

  1. 查看并修改当前数据库innodb_large_prefix参数的值
show variables like '%innodb_large_prefix%';
set global innodb_large_prefix=on;

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

  1. 类似的还有innodb_file_format数据库参数,用于控制column size大小
  2. 修改ROW_FORMATDYNAMICCOMPRESSED

参考 https://www.cnblogs.com/kerrycode/p/9680881.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值