Specified key was too long; max key length is 767 bytes和Index column size too large.

Posted _Slience_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Specified key was too long; max key length is 767 bytes和Index column size too large.相关的知识,希望对你有一定的参考价值。

参考自
https://segmentfault.com/p/1210000010686697/read
https://help.aliyun.com/knowledge_detail/41707.html

数据库版本是mysql5.7.6
导入数据库的时候报Specified key was too long; max key length is 767 bytes

我是按照https://segmentfault.com/p/1210000010686697/read来处理的
首先进入到mysql命令行

show variables like 'innodb_large_prefix'; 

show variables like 'innodb_file_format';


之后修改这两个参数

set global innodb_large_prefix=1;
set global innodb_file_format=BARRACUDA;

这样做的原因是

  • 启用innodb_large_prefix参数能够取消对于索引中每列长度的限制(但是无法取消对于索引总长度的限制)
  • 启用innodb_large_prefix必须同时指定innodb_file_format=barracuda,innodb_file_per_table=true,并且建表的时候指定表的row_format为dynamic或者compressed(mysql 5.6中row_format默认值为compact)

这样操作后在去执行导入数据的操作时错误内容变为了

[Err] 1709 - Index column size too large. The maximum column size is 767 bytes.


出现这个错误的原因是:由于MySQL的Innodb引擎表索引字段长度的限制为767字节,因此对于多字节字符集的大字段或者多字段组合,创建索引时会出现此错误。

以utf8mb4字符集字符串类型字段为例,utf8mb4是4字节字符集,则默认支持的索引字段最大长度是191字符(767字节/4字节每字符≈191字符),因此在varchar(255)或char(255)类型字段上创建索引会失败

关闭这个窗口后,查看当前已经导入的表数据,发现对应的表没有问题,下拉刚刚的信息日志,发现有某个表不存在,我就在导入的sql文件,对应那张表的创建语句上加了

ROW_FORMAT=DYNAMIC 

变成了这样

之后再去执行就没有错了

以上是关于Specified key was too long; max key length is 767 bytes和Index column size too large.的主要内容,如果未能解决你的问题,请参考以下文章

ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

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

Laravel 5.6: Specified key was too long error

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

hive报错: Specified key was too long; max key length is 767 bytes

Laravel 5.4 migrate时报错: Specified key was too long error