似乎像MySQL Bug; 请求:
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 - 操作'非常类似'的排序非法混合
当我们使用latinic时。 请求:
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
答案 0 :(得分:3)
您使用的是哪个版本的MySQL?如the manual中所述:
从MySQL 5.5.3开始,将数值或时间值隐式转换为字符串会产生一个值,该值具有由
character_set_connection
和collation_connection
系统变量确定的字符集和排序规则。 (这些变量通常使用SET NAMES
设置。有关连接字符集的信息,请参阅Section 10.1.4, “Connection Character Sets and Collations”。)此更改意味着此类转换会生成字符(非二进制)字符串(
CHAR
,VARCHAR
或LONGTEXT
值),除非连接字符集设置为binary
。在这种情况下,转换结果是二进制字符串(BINARY
,VARBINARY
或LONGBLOB
值。在MySQL 5.5.3之前,无论连接字符集如何,隐式转换始终会生成二进制字符串。对字符串的这种隐式转换通常发生在字符串值更常见时传递数字或时间值的函数,因此可能具有超出转换值类型的效果。
因此,将TIMESTAMP
列隐式转换为使用LIKE
运算符时发生的字符串总是会产生binary
个字符的字符串如果您使用的是早于5.5.3的MySQL版本,则无论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