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

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

389 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字节)。

### 解决方案:

1. **减少索引长度**:
   你可以通过减少索引的长度来解决这个问题。例如,如果你有一个`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));
复制代码


2. **修改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;
复制代码


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

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


4. **升级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字节的限制。

### 解决方案

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

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


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

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


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

4. **修改表的字符集和排序规则**:
   如果你确实需要将表的字符集改为`utf8mb4`,并且不想减少索引长度,可以考虑以下步骤:

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

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


### 具体操作步骤

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

1. **检查索引长度**:
   首先,检查表中的索引,看看哪些索引可能会导致问题。

  
  1. SHOW INDEX FROM tools_censorhome;
复制代码


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

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


3. **转换字符集**:
   最后,执行字符集转换。

  
  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:3.14.255.247,GMT+8, 2025-5-2 09:59 , Processed in 0.392442 second(s), 82 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

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