Mysql之Specified key was too long; max key length is xx bytes异常

问题原因:mysq索引的字段都太长了

767字节是 MySQL 版本5.6(以及以前版本)中 InnoDB 表的最大索引前缀长度限制,MyISAM 表的长度为1,000字节。在 MySQL 版本5.7及以上版本中,这个限制增加到了3072字节。

如果对 utf8mb4编码的 varchar 字段设置索引,因为utf8mb4编码每个字符占4个字节,所以必须将最大索引前缀长度767字节(或3072字节)除以4,得到191,这是字段的最大字符长度。如果是 utf8 编码,它将是三个字节,最大索引前缀长度为255。

解决办法:让mysql支持比较长的索引,然后在插入表的时候,添加ROW_FORMAT=DYNAMIC ,自动格式化索引。

对于MySQL版本5.6(以及以前版本),如果设置为InnoDB、utf8mb4编码,那么 varchar 类型的字段要想设置索引,则字段长度必须小于等于 191;如果为utf8编码,varchar 字段要想设置索引,字段长度必须小于等于 255

5.7及以上版本中这个数变大了,对于 varchar 类型建立索引一般没有影响了,因为一般我们不会设置太大的varchar类型字段。

出现此类问题的原因都是在于InnoDB 表引擎的限制,默认情况下,索引前缀长度限制为 767 字节,当开启了 innodb_large_prefix 选项时,索引前缀长度扩展到 3072 字节。

show variables like '%innodb_large_prefix%';

Mysql之Specified key was too long; max key length is xx bytes异常_第1张图片

除此之外,索引前缀长度还和 InnoDB 的 page size 有关。innodb_page_size 选项默认是 16KB 的时候,最长索引前缀长度是 3072 字节,如果是 8KB 的时候,最长索引前缀长度是 1536 字节,
默认是3KB的时候,是1024字节,默认是4KB 的时候,是 768 字节。

show variables like '%innodb_page_size%';

Mysql之Specified key was too long; max key length is xx bytes异常_第2张图片

解决方案:

--修改最大索引长度限制
set global innodb_large_prefix=1;
set global innodb_file_format=BARRACUDA;
-- 添加
set global innodb_file_format_max=BARRACUDA;

你可能感兴趣的:(MySQL,mysql,数据库)