随笔 - 547  文章 - 1  评论 - 293  阅读 - 33万

mysql Specified key was too long; max key length is 767 bytes

mysql Specified key was too long; max key length is 767 bytes


<w>查询:ALTER TABLE `order_test_code` MODIFY COLUMN `out_order_no` VARCHAR(200) DEFAULT NULL COMMENT '外部订单号'

共 0 行受到影响, 1 个警告

执行耗时 : 0.098 sec
传送时间 : 1.372 sec
总耗时 : 1.470 sec

Warning Code : 1071
Specified key was too long; max key length is 767 bytes

1.表的字段上面有索引,在扩大索引列的字段的时候会报该错误。
2.表的字段如果没有索引,扩大字段的长度varchar(300) 不会报错。


https://help.aliyun.com/document_detail/211557.html
在DMS中为MySQL建立索引时出现“Specified key was too long; max key length is 767 bytes”报错

问题原因
以MySQL的varchar、char等字符串类型字段作为索引时,单个索引字段存储长度超过了767字节。

解决方法
请根据实际情况选择对应的解决方法:

启用innodb_large_prefix参数
如果您使用的是云数据库RDS,可以在RDS控制台中将innodb_large_prefix参数修改为ON
减小字段存储长度
请根据实际情况将字段存储长度设置为正常的长度:

以InnoDB为引擎的MySQL建立索引时,单个最大索引字段存储长度为767。不同字符集的最大单个索引字段存储长度不同。因此,需要根据不同字符集修改对应字符串类型字段的前缀索引长度。以下是不同字符集定义前缀索引长度的方法。
1.UTF-8MB4
按照表为UTF-8MB4字符集的标准,单个字符需要4个字节进行存储,则最大定义索引前缀需设置为191,具体计算方法如下。
767/4=191

#查询表的脚本:
...
out_order_no varchar(200) default null comment '外部订单号',
...
KEY 'out_order_no_idx' ('out_order_no'(191))
}ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4

 

2.UTF-8
按照表为UTF-8字符集的标准,单个字符需要3个字节进行存储,则最大定义索引前缀需设置为255,具体计算方法如下。
767/3=255

3.GBK
按照表为GBK字符集的标准,单个字符需要2个字节进行存储,则最大定义索引前缀需设置为383,具体计算方法如下。
767/2=383

posted on   oktokeep  阅读(90)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示