MySQL创建索引时提示“Specified key was too long; max key length is 767 bytes”

MySQL创建索引时提示“Specified key was too long; max key length is 767 bytes”

问题描述

数据库RDS MySQL版在创建表索引时,出现如下错误信息。

  • Error 1071: Specified key was too long; max key length is 767 bytes.
    
  • ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.
    

问题原因

  • 由于MySQL的InnoDB引擎表索引字段长度的限制为767字节,因此对多字节字符集的大字段或者多字段组合,在创建索引时会出现该问题。
  • 说明
  • 以utf8mb4字符集的字符串类型字段为例。utf8mb4是4个字节字符集,默认支持的索引字段最大长度是191字符(767字节/4字节每字符≈191字符),因此在varchar(255)或char(255)类型字段上创建索引会失败。详情请参见 MySQL官网文档

解决方案

  • 请参考以下内容,将innodb_large_prefix参数值修改为ON,修改后对于Dynamic和Compressed格式的InnoDB引擎表,其支持的最大索引字段长度为3072字节:
  • 说明
  • 在MySQL 8.0中已经删除了innodb_large_prefix参数,您可通过调整数据表的Row_format值来解决,具体操作请参见第3步操作。
  1. 登录RDS控制台,选择目标地域,单击目标实例ID,单击参数设置,将innodb_large_prefix值修改为ON,单击确定,然后单击提交参数即可。innodb_large_prefix

  2. 登录数据库,执行以下SQL语句,确认innodb_large_prefix值为ON。

    show variables like 'innodb_large_prefix';
    

    系统显示类似如下。返回结果

  3. 配置Row Format。

    说明

    • 将innodb_large_prefix参数值修改为ON后,对于Dynamic和Compressed格式的InnoDB引擎表,其支持的最大索引字段长度为3072字节。

    • 只支持DYNAMIC和COMPRESSED格式的表,compact格式的表不支持。

    • 创建表时配置:指定表的Row Format为Dynamic或Compressed,示例如下。

      create table [$Table_Name] (id int auto_increment primary key, name varchar(255)) ROW_FORMAT=DYNAMIC default charset utf8mb4;
      

      说明 [$Table_Name]为表名。

    • 修改已有表配置:

      1. 执行以下SQL语句,查看Row_format取值,如果取值不是DYNAMIC和COMPRESSED,则执行后续步骤修改取值。

        show table status like '[$Table_Name]'\G
        

        系统显示类似如下。返回结果2

      2. 根据实际情况,执行其中一条SQL语句,修改Row_format值。

        alter table [$Table_Name] Row_format=dynamic;alter table [$Table_Name] Row_format=compressed;
        
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT枫斗者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值