简述
两个字段进行比较的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 '<>'
错误分析
产生错误的原因:
- 表
article
的author
字段的字符集是utf8mb4_general_ci
。 - 表
author
的name
字段的字符集是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
时间型