搜索时出现Illegal mix of collations for operation 'like' 错误

 更新时间:2020年11月30日 11:33  
Illegal mix of collations for operation 'like'
select count(*) as total from ***_ecms_live where (title like '%高级%' or sskehu like '%高级%' or ssgs like '%高级%' or domain like '%高级%'

站长在给一个帝国cms网站搬家时发现后台信息搜索出错,提示如下错误 


Illegal mix of collations for operation 'like'

select count(*) as total from ***_ecms_live where (title like '%高级%' or sskehu like '%高级%' or ssgs like '%高级%' or domain like '%高级%'


这是由于升级mysql5.5才会出现的错误,


只需打开 /e/admin/LisNews.php


查找:


$sr['searchallfield'].=$or.$r1[1]." like '%[!--key--]%'";

改为


$sr['searchallfield'].=$or.$r1[1]." like binary '%[!--key--]%'";

即可



错误分析

产生错误的原因:

  • 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.idwhere CAST(ar.author AS char) <> CAST(au.name AS char);1234

关于cast函数的语法

CAST(field AS type)1

其中,可选的type如下:

  • CHAR 字符型

  • DATE 日期型

  • DATETIME 日期和时间型

  • DECIMAL float型

  • SIGNED int

  • TIME 时间型