数据表中字段排序规则不一致(utf8mb4_general_ci、utf8mb4_0900_ai_ci)导致的错误,附解决办法

文章描述了在MySQL8.0中遇到的字符集冲突问题,具体表现为非法混合排序规则错误。作者尝试将所有排序规则改为utf8mb4_general_ci,但由于外键约束失败。最终解决方案是统一改为utf8mb4_0900_ai_ci,这是MySQL8.0的默认排序规则。提供了通过phpMyAdmin批量修改数据库、表和字段排序规则的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境:

数据库版本MySQL 8.0.32

报错:

在查询数据的时候返回以下错误

"(1267, \"Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '='\")"

报错分析及初期解决过程:

该错误是因为在执行查询或比较操作时,涉及到了不同字符集的表或字段之间的比较,导致出现了字符集冲突。

utf8mb4_general_ci为程序要求的排序规则,所以初期尝试将数据库、数据表、字段的排序规则中,有utf8mb4_0900_ai_ci的都统一修改为utf8mb4_general_ci。

但将排序规则统一修改为utf8mb4_general_ci时报错,报错如下:

#3780 - Referencing column 'user_id' and referenced column 'id' in foreign key constraint 'django_admin_log_user_id_c564eba6_fk_lyadmin_users_id' are incompatible.

因为外键字段的排序规则为utf8mb4_0900_ai_ci,所以无法将改外键字段的排序规则修改为utf8mb4_general_ci。尝试了很多方法,不是不行就是有弊端。

最终解决办法:

将数据库、数据表、字段的排序规则从utf8mb4_general_ci统一修改为utf8mb4_0900_ai_ci后问题解决。

原因如下:

MySQL 8.0之后,默认collation不再像之前版本一样是是utf8mb4_general_ci,而是统一更新成了utf8mb4_0900_ai_ci

可视化批量修改数据表和字段排序规则方法:

进入phpMyAdmin(我用的版本phpMyAdmin 5.2)

1.点击要修改的数据库

2.点击右侧操作菜单

3.页面下方找到排序规则,设置排序规则

4.点执行即可(该操作会批量修改数据库、所有数据表、所有字段的排序规则)

 补充:如果只是想单独修改一个表和该表字段的排序规则,需要修改那个表点击后再点击操作菜单,按图示操作即可。

参考文章:

当时是因为看了这位朋友的文章才恍然大悟,附上链接以此感谢。

mysql设置了utf8mb4,为什么还有utf8mb4_general_ci和utf8mb4_0900_ai_ci?_utf8mb4_0900_as_ci_LINgZone2的博客-CSDN博客

MySQL中的`utf8mb4_0900_ai_ci`和`utf8mb4_general_ci`都是为了支持UTF-8字符集,但它们之间存在一些关键区别: 1. **排序规则**: - `utf8mb4_0900_ai_ci`(ASCII Ignorant Case Insensitive):这是一种对大小写敏感的排序规则,但它只处理ASCII字符范围内的字词顺序。对于非ASCII字符,它会按照Unicode全字节范围进行排序,可能会导致一些意想到的结果,尤其是当涉及非英语字母时。 - `utf8mb4_general_ci`(General Case Insensitive):这是MySQL推荐的标准通用排序规则,它同样是对大小写敏感的,但是整个字符串都基于Unicode进行比较,包括所有的多字节字符。 2. **搜索速度**: - `utf8mb4_0900_ai_ci`由于仅考虑ASCII字符,其搜索速度通常比`utf8mb4_general_ci`更快。然而,如果你的数据集中包含大量的非ASCII字符,这个优势就复存在了。 - `utf8mb4_general_ci`虽然速度略慢,但在处理各种语言和字符集时提供了更一致的行为。 3. **兼容性**: - `utf8mb4_0900_ai_ci`在某些旧版本的MySQL中可能存在兼容性问题,因为它是一个通用的字符集选项。 - `utf8mb4_general_ci`更通用,适用于大部分现代MySQL环境。 综上所述,选择哪一个取决于你的具体需求。如果你的数据主要是英文或者其他ASCII字符,而且对搜索性能有较高要求,可以选择`utf8mb4_0900_ai_ci`。但如果需要处理多种语言的复杂情况,建议使用`utf8mb4_general_ci`,尽管这可能会牺牲一些查询速度。同时,确保你的表和字段也都设置为`utf8mb4`字符集。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值