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

版权声明:欢迎转载,请附上原文链接 https://blog.csdn.net/hfut_wowo/article/details/88018800

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);

猜你喜欢

转载自blog.csdn.net/hfut_wowo/article/details/88018800