全部产品

RDS 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.

问题原因

由于MySQL的InnoDB引擎表索引字段长度的限制为767字节,因此对于多字节字符集的大字段或者多字段组合,创建索引时会出现该问题。

说明:以utf8mb4字符集字符串类型字段为例。utf8mb4是4字节字符集,默认支持的索引字段最大长度是191字符(767字节/4字节每字符≈191字符),因此在varchar(255)char(255)类型字段上创建索引会失败。详情请参见MySQL官网文档

解决方案

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。
  1. 在控制台的参数设置页面修改innodb_large_prefix参数值ON或者1,然后单击提交参数
    innodb_large_prefix
    说明:将innodb_large_prefix参数值修改为ON或者1后,对于Dynamic和Compressed格式的InnoDB引擎表,其最大的索引字段长度支持到3072字节。
  2. 创建表时指定表的Row Format为Dynamic或Compressed,示例如下。
    create table idx_length_test_02
    (
      id int auto_increment primary key,
      name varchar(255)
    ) 
    ROW_FORMAT=DYNAMIC default charset utf8mb4;
    对已经创建的表,修改表的Row Format的SQL语句如下所示。
    alter table idx_length_test_02 row_format=dynamic;
    alter table idx_length_test_02 row_format=compressed;

适用于

  • 云数据库RDS

如果您的问题仍未解决,您可以在阿里云社区免费咨询,或提交工单联系阿里云技术支持。