站长在给一个帝国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--]%'";
即可
错误分析
产生错误的原因:
表
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.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
intTIME
时间型
下一篇: 返回列表