1.错误信息
项目上线之后进行业务验证时发现报错,报错如下:
1267 - Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and
(utf8mb4_general_ci,IMPLICIT) for operation '='
2.错误分析
- 这个错误通常发生在MySQL数据库中,当你尝试比较或操作两个具有不同字符集或排序规则(collation)的列时。在这个特定的例子中,你正在尝试将utf8mb4_general_ci和utf8mb4_0900_ai两种排序规则下的数据进行比较或操作,这是不允许的。
- 因为我们项目之前使用的是mysql5.7版本,后来换成了mysql8.0所以出现了这个问题。
- MySQL 5.7和MySQL 8.0排序规则如下:
-
- MySQL 5.7排序规则 (Collation):对于 utf8mb4 字符集,默认排序规则可能是 utf8mb4_general_ci
-
- MySQL 8.0及之后的版本排序规则 (Collation):对于 utf8mb4 字符集,默认排序规则是 utf8mb4_0900_ai_ci
- 修改字符集sql如下:
ALTER TABLE user MODIFY name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
3.解决错误:
- 知道了错误原因解决起来很容易,修改对应表的排序规则就行了,但是千万要注意修改之前需要分析与改表关联查询的其他表是否会有排序规则不一致的问题。切误因为解决当前查询包括而造成其他关联表查询报错
最后如果想查询表中字段使用的排序规则可以使用如下sql:
-- 查询xxx库中表和字段使用的排序规则
SELECT TABLE_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'xxx';