Specified key was too long; max key length is 767 bytes问题解决

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

在做一次mysql数据表迁移的时候碰到了这个问题。通过查阅资料和文档,这个问题的大致原因如下:

在mysql5.6中索引列的最大长度为767个字节。

简单讲,就是如果你将某列加入到索引中,而索引的内容大于767个字节,那么将会出现这个错误。
而对于一般建表来说,我们使用的多是int、tinyint、varchar这种类型。那么如何判断是否大于767bytes这个阈值呢?
int、tinyint当然不会超过这个长度。一般来说,都是varchar和text出现该问题。我们先看text:
1、直接将text作为索引:
在这里插入图片描述
可以看出,text不能直接作为索引,必须指定长度。那么如何指定长度呢?
在这里插入图片描述
这里使用了255的长度,那么使用256的长度会如何呢?
在这里插入图片描述
可以看出这里创建失败了,超过了767bytes。

2、接下来,使用最常用的utf-8来分别创建长度255/256的varchar类型索引:
在这里插入图片描述
可以看出,在utf-8字符集下,255成功,256失败,utf-8一个字符占用3个字节,这就验证了mysql5.6最长的索引是767这点了。

3、那如果使用GBK字符集(1字符=2字节),能否成功创建256的索引呢?
在这里插入图片描述
成功!

好了问题定位了,那么怎么解决这个问题呢?
这里推荐四种办法:
先说最推荐的:
1、前缀索引,不使用列的全部内容作为索引,使用一部分,例如在原有的例子中我们使用了test列作为索引无法建表,但是如果改为使用test(255)作为索引就可以了,这就是所谓的使用前缀索引:
在这里插入图片描述

2、升级mysql;
3、缩小索引长度(256缩小到255以下);
4、修改字符集(utf-8修改到GBK);

  • 11
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值