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%';

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

show variables like '%innodb_page_size%';

解决方案:

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

相关推荐

  1. mysql获取时间异常

    2023-12-19 04:06:03       67 阅读
  2. SpringMVC异常处理

    2023-12-19 04:06:03       65 阅读
  3. 错误与异常为何要异常

    2023-12-19 04:06:03       53 阅读
  4. python异常assert语句

    2023-12-19 04:06:03       74 阅读
  5. Springboot全局异常处理

    2023-12-19 04:06:03       53 阅读
  6. C#基础异常处理

    2023-12-19 04:06:03       36 阅读
  7. MYSQL无法用指令备份,出现异常

    2023-12-19 04:06:03       60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-19 04:06:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-19 04:06:03       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-19 04:06:03       87 阅读
  4. Python语言-面向对象

    2023-12-19 04:06:03       96 阅读

热门阅读

  1. Cmake找不到mysql.h和libmysqlclient.so

    2023-12-19 04:06:03       67 阅读
  2. 如何在Linux命令行下发送和接收UDP数据包

    2023-12-19 04:06:03       64 阅读
  3. PostgreSQL 获取指定根节点及其所有子集的id

    2023-12-19 04:06:03       54 阅读
  4. Vue系列之指令 v-html

    2023-12-19 04:06:03       53 阅读
  5. Electron中Tray的setContextMenu导致窗口无法聚焦

    2023-12-19 04:06:03       57 阅读
  6. 【MySQL】(DDL)总结

    2023-12-19 04:06:03       63 阅读
  7. 常见SQL语句速通

    2023-12-19 04:06:03       54 阅读
  8. spring之基于注解管理Bean

    2023-12-19 04:06:03       47 阅读
  9. 【Unity】如何让Unity程序一打开就运行命令行命令

    2023-12-19 04:06:03       62 阅读
  10. 【redis】redis使用get及set功能,及发布订阅

    2023-12-19 04:06:03       58 阅读
  11. uniapp蓝牙

    2023-12-19 04:06:03       57 阅读
  12. log4j日志打印配置

    2023-12-19 04:06:03       69 阅读