表关联查询:utf8mb4_general_ci和utf8mb4_0900_ai_ci两种不同的校对规则在操作符‘=‘时混用了

异常信息:

复制代码
 Error querying database. Cause: java.sql.SQLException: Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '=' ### 
复制代码
### Cause: java.sql.SQLException: Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '=' ; uncategorized SQLException; SQL state [HY000]; error code [1267]; Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '='; nested exception is java.sql.SQLException: Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '='

解决方案:

校对规则(collation)决定了字符串比较和排序的方式。当两个字符串的校对规则不同时,MySQL可能无法正确比较它们,从而导致这样的错误。用户执行的是一个JOIN操作,涉及到多个表,尤其是tb_device和tb_region这两个表。根据错误提示,问题出现在某个ON子句中的列比较,可能是它们的字符集或校对规则不一致。

这个错误是由于在MySQL查询中,不同校对规则(collation)的列进行了比较导致的。以下是逐步解决方案:

1. 定位冲突的列

错误信息指出在=操作时混用了utf8mb4_general_ciutf8mb4_0900_ai_ci两种校对规则。检查以下JOIN条件中的列:

sql 复制代码
cd.device_guid = cdb.device_guid       -- 检查 device_guid 列
cdb.business_id = cb.business_id       -- 检查 business_id 列
cdb.province = cr.ad_code              -- 检查 province 和 ad_code 列

2. 查看列的校对规则

对每个涉及的列执行以下SQL,确认其字符集和校对规则:

sql 复制代码
SHOW CREATE TABLE tb_device_base;
SHOW CREATE TABLE tb_region;

3. 统一校对规则

方法一:修改表结构(永久生效)

如果确认某些列的校对规则不一致,修改它们的定义:

sql 复制代码
ALTER TABLE tb_device_base 
MODIFY COLUMN province VARCHAR(255) 
CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

ALTER TABLE tb_region 
MODIFY COLUMN ad_code VARCHAR(255) 
CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

将冲突列的校对规则改为相同值(如统一为utf8mb4_0900_ai_ci)。

方法二:在查询中强制转换校对规则

无需修改表结构,直接在查询时指定校对规则:

sql 复制代码
SELECT ...
FROM tb_device_base cdb
LEFT JOIN tb_region cr ON 
  cdb.province = cr.ad_code COLLATE utf8mb4_0900_ai_ci  -- 强制统一校对规则
...

ON子句中使用COLLATE关键字显式指定校对规则。

4. 检查数据库默认配置

确保相关表的默认字符集和校对规则一致:

sql 复制代码
-- 修改表的默认校对规则
ALTER TABLE tb_device_base 
DEFAULT CHARACTER SET utf8mb4 
COLLATE utf8mb4_0900_ai_ci;

-- 修改数据库默认校对规则
ALTER DATABASE your_database_name 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_0900_ai_ci;

5. 验证修复

重新运行查询,确认错误是否消失。如果仍有问题,重复步骤2-3检查其他可能冲突的列。

注意事项

  • 备份数据:修改表结构前务必备份。
  • 性能影响utf8mb4_0900_ai_ci是更新的校对规则,提供更准确的比较,但可能略微影响性能。
  • 兼容性:确保应用程序逻辑适应校对规则变更后的字符串比较行为。

通过以上步骤,可消除因校对规则不匹配导致的查询错误。

相关推荐
Hello.Reader28 分钟前
PySpark DataFrame 快速入门创建、查询、分组、读写、SQL 实战一篇讲透
数据库·sql·spark
只能是遇见34 分钟前
ERROR 1524 (HY000) Plugin ‘mysql_native_password‘ is not loaded
android·数据库·mysql
1688red1 小时前
基于Canal实现MySQL到Elasticsearch的数据同步
数据库·mysql·elasticsearch
我真会写代码1 小时前
从底层到实战:MySQL核心原理拆解,解锁数据库高性能密码
数据库·mysql
LF3_1 小时前
监听数据库binlog日志变化,将变动实时发送到kafka
数据库·分布式·mysql·kafka·binlog·debezium
江不清丶2 小时前
事务隔离级别深度解析:从理论到MySQL实现
数据库·mysql
麦聪聊数据5 小时前
利用实时数据管道与 SQL2API 重构企业自动化审计架构
数据库·sql·低代码
麦聪聊数据5 小时前
重构开放生态:利用 QuickAPI 跨越遗留系统与敏捷交付的工程实践
数据库·sql·低代码·restful
百结2149 小时前
Mysql数据库操作
数据库·mysql·oracle
ego.iblacat10 小时前
MySQL 服务基础
数据库·mysql