背景

今天在做MySQL的关联查询的时候,出现了如下的错误:
我的查询SQL:

select * from house as c
left join house_info as d
on c.guid =  d.guid
where c.guid in ('5050893b-4748-4db9-8b37-523ce483e4bd','2fb1dc01-3aed-4cba-b513-5568da8d72b2','dfe47f0e-0282-4368-ad8d-a9e4bfed6db6','a37c2c98-2ecd-4b62-a13f-1badba530d3d');
illegal mix of collations (utf8mb4_0900_ai_ci,implicit) and (utf8mb4_general_ci,implicit) for operation '='

从字面的错误信息上看,是由于校对规则或者叫排序规则不一致导致的,主要原因其实是由于:在比较或连接操作中使用了不同的字符集和校对规则所致。在MySQL中,如果要执行比较操作,连接的两个字段必须具有相同的字符集和校对规则。

那么都有什么办法可以解决这个问题呢?

解决

下面是一些常见的解决办法,供参考:

  1. 显式转换字符集:在比较或连接操作之前,使用CONVERT()函数将字段显式转换为相同的字符集和校对规则。例如:

    select * from house as c
    left join house_info as d
    on CONVERT(c.guid USING utf8mb4) =  CONVERT(d.guid USING utf8mb4)
    where c.guid in ('5050893b-4748-4db9-8b37-523ce483e4bd','2fb1dc01-3aed-4cba-b513-5568da8d72b2','dfe47f0e-0282-4368-ad8d-a9e4bfed6db6','a37c2c98-2ecd-4b62-a13f-1badba530d3d');
    
  2. 修改表结构:将表中的字段的字符集和校对规则修改为一致的。例如,通过修改表结构中的字段或者指定查询结果的字符集。

  3. 设置连接时的字符集:在连接时,可以使用COLLATE关键字显式设置连接的字符集和校对规则。例如:

    select * from house as c
    left join house_info as d
    on c.guid =  d.guid COLLATE utf8mb4_unicode_ci
    where c.guid in ('5050893b-4748-4db9-8b37-523ce483e4bd','2fb1dc01-3aed-4cba-b513-5568da8d72b2','dfe47f0e-0282-4368-ad8d-a9e4bfed6db6','a37c2c98-2ecd-4b62-a13f-1badba530d3d');
    

总结

在设计数据库和表结构的时候尽量要保持字符集和校对规则的一致,如果出现了不一致的情况,可以通过以上的方法去解决。

更多推荐