看起来像MySQL错误;请求:
SELECT *
FROM table
WHERE (
id LIKE '%тест 199%'
OR `user` LIKE '%тест 199%'
OR `user_datetime` LIKE '%тест 199%'
OR `user_comments` LIKE '%тест 199%' )
ORDER BY id desc
LIMIT 0, 10
[Err] 1271 - 非法混合排序规则以执行"喜欢"操作
当我们使用拉丁语时。请求:
SELECT *
FROM table
WHERE (
id LIKE '%test 199%'
OR `user` LIKE '%test 199%'
OR `user_datetime` LIKE '%test 199%'
OR `user_comments` LIKE '%test 199%' )
ORDER BY id desc
LIMIT 0, 10
请求成功;
如何处理?
我的所有请求都是自动生成的,我无法更改逻辑coz函数生成器有很多依赖性。
设置:
SET NAMES utf8
Character set utf8 -- UTF-8 Unicode
Collation utf8_general_ci
用于@eggyal的 UPD
Request:
SHOW CREATE TABLE `comments`
Response:
CREATE TABLE `comments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user` varchar(255) NOT NULL DEFAULT '',
`user_datetime` timestamp NULL DEFAULT NULL,
`user_comments` varchar(128) DEFAULT NULL,
UNIQUE KEY `id` (`id`) USING BTREE,
KEY `user_comments` (`user_comments`),
) ENGINE=InnoDB AUTO_INCREMENT=128456 DEFAULT CHARSET=utf8
MySQL 版本 5.5.10
你使用的是哪个版本的MySQL? 如手册中所述:
从MySQL 5.5.3开始,将数字或时态值隐式转换为字符串会产生一个值,该值具有由
character_set_connection
和collation_connection
系统变量确定的字符集和排序规则。(这些变量通常使用SET NAMES
进行设置。有关连接字符集的信息,请参见第 10.1.4 节 "连接字符集和归类"。此更改意味着此类转换会产生字符(非二进制(字符串(
CHAR
、VARCHAR
或LONGTEXT
值(,除非连接字符集设置为binary
。在这种情况下,转换结果是一个二进制字符串(BINARY
、VARBINARY
或LONGBLOB
值(。在MySQL 5.5.3之前,隐式转换始终生成二进制字符串,无论连接字符集如何。当字符串值更常见时,通常会对传递数值或时态值的函数进行这种对字符串的隐式转换,因此可能会产生超出转换后值类型的影响。
因此,如果您使用的是低于 5.5.3 的 MySQL 版本,则在使用 LIKE
运算符时将TIMESTAMP
列隐式转换为字符串将始终导致binary
字符集的字符串,无论SET NAMES
如何(奇怪的是,sqlfiddle 也是如此,它声称是 5.5.20(; 由于此类字符串无法与utf8
字符集中的字符串进行比较, 您必须将user_datetime
列显式转换为 UTF-8 字符串:
SELECT *
FROM `comments`
WHERE (
`id` LIKE '%тест 199%'
OR `user` LIKE '%тест 199%'
OR CONVERT(`user_datetime` USING utf8) LIKE '%тест 199%'
OR `user_comments` LIKE '%тест 199%'
)
ORDER BY `id` DESC
LIMIT 0, 10