·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹📱AI全功能
返回列表 发布新帖

(1071) Specified key was too long; 这个是怎么解决啊

[复制链接]
549 2
发表于 2023-1-13 07:51:22 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
(1071) Specified key was too long; max key length is 767 bytes

ALTER TABLE tools_censorhome CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

我看到很多人问,有什么解决方案吗!


我升级之前卸载了所有的插件,但是还是出这个问题。
我要说一句 收起回复

评论2

AI智能体Lv.7 发表于 2025-3-17 19:30:49 | 查看全部
这个问题通常是由于MySQL数据库的索引长度限制引起的。在MySQL中,utf8mb4字符集每个字符占用4个字节,而utf8字符集每个字符占用3个字节。因此,当你在使用utf8mb4字符集时,索引的长度可能会超过MySQL的默认限制(767字节)。

解决方案:
  • 减少索引长度:

   你可以通过减少索引的长度来解决这个问题。例如,如果你有一个VARCHAR(255)的字段,并且你在这个字段上创建了索引,你可以将索引的长度减少到191(因为 191 * 4 = 764,小于767字节)。

  
  1. ALTER TABLE tools_censorhome MODIFY column_name VARCHAR(191);
复制代码


   或者直接在创建索引时指定长度:

  
  1. CREATE INDEX index_name ON tools_censorhome (column_name(191));
复制代码


  • 修改MySQL配置:

   如果你有权限修改MySQL的配置,可以通过修改innodb_large_prefix和innodb_file_format来允许更大的索引长度。

   在MySQL配置文件(通常是my.cnf或my.ini)中添加或修改以下配置:

  
  1. [mysqld]
  2.    innodb_large_prefix=1
  3.    innodb_file_format=Barracuda
  4.    innodb_file_per_table=1
复制代码


   然后重启MySQL服务。

   之后,你可以将表的行格式改为DYNAMIC或COMPRESSED:

  
  1. ALTER TABLE tools_censorhome ROW_FORMAT=DYNAMIC;
复制代码


  • 使用utf8字符集:

   如果你不需要支持4字节的字符(如emoji表情),可以考虑使用utf8字符集,而不是utf8mb4。

  
  1. ALTER TABLE tools_censorhome CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
复制代码


  • 升级MySQL版本:

   如果你使用的是MySQL 5.6或更早的版本,考虑升级到MySQL 5.7或更高版本。MySQL 5.7及更高版本对utf8mb4字符集的支持更好,索引长度限制也有所放宽。

总结:
根据你的具体情况,选择合适的解决方案。如果你需要支持4字节字符(如emoji),建议使用第一种或第二种方法。如果不需要支持4字节字符,可以考虑使用第三种方法。

如果你有更多问题或需要进一步的帮助,欢迎继续提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复
AI智能体Lv.7 发表于 2025-3-20 05:39:40 | 查看全部
这个问题通常是由于MySQL数据库的索引长度限制引起的。在MySQL中,索引的最大长度是767字节(对于InnoDB表,在MySQL 5.6及更早版本中)。当你尝试将表的字符集从utf8转换为utf8mb4时,由于utf8mb4每个字符占用4个字节,而utf8每个字符占用3个字节,因此索引长度可能会超过767字节的限制。

解决方案
  • 减少索引长度:

   你可以通过减少索引的长度来解决这个问题。例如,如果你有一个VARCHAR(255)的字段,并且它被索引了,你可以将它的长度减少到VARCHAR(191),因为191 * 4 = 764字节,这小于767字节的限制。

  
  1. ALTER TABLE tools_censorhome MODIFY column_name VARCHAR(191);
复制代码


  • 使用前缀索引:

   如果你不想减少字段的长度,可以使用前缀索引。前缀索引只对字段的前N个字符进行索引,从而减少索引的长度。

  
  1. CREATE INDEX index_name ON tools_censorhome (column_name(191));
复制代码


  • 升级MySQL版本:

   如果你使用的是MySQL 5.6或更早版本,考虑升级到MySQL 5.7或更高版本。在MySQL 5.7及更高版本中,InnoDB表的索引长度限制已经增加到3072字节。

  • 修改表的字符集和排序规则:

   如果你确实需要将表的字符集改为utf8mb4,并且不想减少索引长度,可以考虑以下步骤:

  • 首先,备份你的数据库。
  • 然后,删除或修改可能导致索引长度超过限制的索引。
  • 最后,执行字符集转换。


  
  1. ALTER TABLE tools_censorhome CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
复制代码


具体操作步骤
假设你有一个表tools_censorhome,并且你希望将其字符集转换为utf8mb4,你可以按照以下步骤操作:

  • 检查索引长度:

   首先,检查表中的索引,看看哪些索引可能会导致问题。

  
  1. SHOW INDEX FROM tools_censorhome;
复制代码


  • 修改索引长度:

   如果发现某些索引的长度超过了限制,可以修改这些索引的长度。

  
  1. ALTER TABLE tools_censorhome MODIFY column_name VARCHAR(191);
复制代码


  • 转换字符集:

   最后,执行字符集转换。

  
  1. ALTER TABLE tools_censorhome CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
复制代码


总结
这个问题通常是由于索引长度超过MySQL的限制引起的。通过减少索引长度、使用前缀索引或升级MySQL版本,你可以解决这个问题。如果你有其他问题或需要进一步的帮助,请随时联系我。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

最新热评 加载中...
AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 ) 知道创宇云防御

您的IP:216.73.216.247(美国),GMT+8, 2026-10-31 12:51 , Processed in 2.846948 second(s), 49 queries , Gzip On, Redis On.

Powered by Discuz! X5.1 Licensed

© 2001-2026 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表