4

好像是 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 - 操作“like”的排序规则的非法混合

当我们使用拉丁语时。要求:

        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

请求成功;

如何处理?

我所有的请求都是自动生成的,我不能改变逻辑因为函数生成器有很多依赖。

设置:

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

4

1 回答 1

3

您使用的是什么版本的 MySQL?如手册所述:

从 MySQL 5.5.3 开始,将数值或时间值隐式转换为字符串会产生一个值,该值具有由character_set_connectioncollation_connection系统变量确定的字符集和排序规则。(这些变量通常用 设置SET NAMES。有关连接字符集的信息,请参阅第 10.1.4 节,“连接字符集和排序规则”</a>。)

此更改意味着此类转换会生成字符(非二进制)字符串(aCHARVARCHARLONGTEXT值),除非连接字符集设置为binary。在这种情况下,转换结果是二进制字符串(a BINARY、、VARBINARYLONGBLOB值)。

在 MySQL 5.5.3 之前,无论连接字符集如何,隐式转换总是产生二进制字符串。当字符串值更常见时,这种对字符串的隐式转换通常发生在传递数值或时间值的函数中,因此可能会产生超出转换值类型的影响。

因此,如果您使用早于 5.5.3 的 MySQL 版本,则TIMESTAMP在使用运算符时将列隐式转换为字符串LIKE始终导致字符集的字符串(奇怪的是,sqlfiddle 也是这种情况,声称是5.5.20);由于此类字符串无法与字符集中的字符串进行比较,因此您必须将列显式转换为 UTF-8 字符串:binarySET NAMESutf8user_datetime

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
于 2012-04-30T09:02:25.257 回答