Mysql 建表错误1071 - Specified key was too long; max key length is 767 bytes

今天遇到了一个Mysql建表问题,报错1071 - Specified key was too long; max key length is 767 bytes。

仔细查看建表sql语句,没有发现什么特别的地方,最后找到原因,这里记录下。

起因:

我在表中设置某个字段为varchar(255) unique,执行建表语句就报错。

经过各方查找,我发现了这个问题和数据库字符集有关。具体的情况stackoverflow上大家的讨论:一个utf8字符占3个byte,一个utf8mb4的字符占4个byte,而mysql的innodb有限制索引长度不得超过767,简而言之就是一个公式。

utf8: 255*3 = 765 < 767 < 256*3 = 768
utf8mb4: 191*4 = 764 < 767 < 192*4=768

所以就得出了结论

INNODB utf8 VARCHAR(255)
INNODB utf8mb4 VARCHAR(191)

解决办法有以下几种:

1.建表时候直接指定使用utf8字符集而不是utf8mb4(这个方案就是修改字符集,当然你也可以修改mysql的全局配置实现)

2.使用innodb建表,并设置mysql配置项innodb_large_prefix=on,这种办法就是设置启用innodb_large_prefix选项,将约束项扩展至3072byte

3.修改字段长度即utf8下面255 utf8mb4下191

本文由 Leo's Blog 创作,采用 署名-非商业性使用 2.5 中国大陆 进行许可。
如需转载、引用请署名作者且注明文章出处。
2017年01月18日 5343 浏览 评论 MySql utf8 utf8mb4 字符集 索引长度
上一篇:Threejs 沿非中心点旋转 | 下一篇:Linux操作拾遗——为git添加多个账户