Illegal mix of collations (...) and (...) for operation 不修改表结构处理方法

简述

两个字段进行比较的SQL,出现错误。

# 无需在意逻辑
select *
from article As ar left join author AS au on ar.author_id = au.id
where ar.author <> au.name;

错误

Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for operation '<>'

错误分析

产生错误的原因:

  • articleauthor字段的字符集是utf8mb4_general_ci
  • authorname字段的字符集是utf8mb4_unicode_ci
  • 不同字符集的字段不能直接进行比较。

解决方法

根本的解决方法是通过DDL修改表结构,使其字段类型一致。

但是,有时候可能因为条件限制,不能进行DDL操作。

下面提供一种不修改表结构的解决方法:通过cast内置函数转换类型(方法不唯一,比方说convert函数也可以)。

# 无需在意逻辑
select *
from article As ar left join author AS au on ar.author_id = au.id
where CAST(ar.author AS char) <> CAST(au.name AS char);

关于cast函数的语法

CAST(field AS type)

其中,可选的type如下:

  • CHAR 字符型
  • DATE 日期型
  • DATETIME 日期和时间型
  • DECIMAL float型
  • SIGNED int
  • TIME 时间型

你可能感兴趣的:(MySql,mysql,utf8,字符集,cast,char)