运算符,字段类型时间戳和西里尔字母? MySQL Bug?

时间:2012-04-30 06:16:39

标签: mysql character-encoding internationalization pdo

似乎像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

1 个答案:

答案 0 :(得分:3)

您使用的是哪个版本的MySQL?如the manual中所述:

  

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

     

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

     

在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