为了账号安全,请及时绑定邮箱和手机立即绑定

#1071-指定的键太长;最大键长度为767字节

#1071-指定的键太长;最大键长度为767字节

繁花如伊 2019-06-11 21:03:10
#1071-指定的键太长;最大键长度为767字节当我执行以下命令时:ALTER TABLE `mytable` ADD UNIQUE (`column1` ,`column2`);我收到了一条错误消息:#1071 - Specified key was too long; max key length is 767 bytes关于第1栏和第2栏的资料:column1 varchar(20) utf8_general_ci column2  varchar(500) utf8_general_ci我认为varchar(20)只需要21个字节varchar(500)只需要501字节。所以总字节是522,小于767。那么为什么我会收到错误信息呢?#1071 - Specified key was too long; max key length is 767 bytes
查看完整描述

3 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

767字节是规定前缀限制对于MySQL版本5.6中的InnoDB表(和以前的版本)。MyISAM表的长度为1,000字节。在MySQL版本5.7及以上中,这个限制已经增加到3072字节。

您还必须注意,如果您在一个大char或varchar字段上设置了一个索引,该字段是utf8mb4编码的,则必须将最大索引前缀长度767字节(或3072字节)除以4,导致191字节。这是因为utf8mb4字符的最大长度是4个字节。对于UTF 8字符,它将是三个字节,导致最大索引前缀长度为254。

您可以选择只对VARCHAR字段设置下限。

另一个选项(根据对这一问题的回应)是获取列的子集,而不是整笔金额,即:

ALTER TABLE `mytable` ADD UNIQUE ( column1(15), column2(200) );

虽然您需要获得应用的关键,但我不知道是否值得检查有关该实体的数据模型,看看是否有改进可以让您实现预期的业务规则,而不会达到MySQL的限制。


查看完整回答
反对 回复 2019-06-11
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

如果有人对INNODB/utf-8尝试将UNIQUE索引VARCHAR(256)字段,切换到VARCHAR(255)..似乎255是限制。


查看完整回答
反对 回复 2019-06-11
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

当你达到极限的时候。设置如下。

  • INNODB

    utf8 VARCHAR(255)

  • INNODB

    utf8mb4 VARCHAR(191)


查看完整回答
反对 回复 2019-06-11
  • 3 回答
  • 0 关注
  • 809 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信