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

成功をリクエストします。

どのように対処しますか?

私の要求はすべて自動的に生成されます。ロジックを変更することはできません。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

4

1 に答える 1

3

どのバージョンの MySQL を使用していますか? マニュアルに記載されているように:

character_set_connectionMySQL 5.5.3 の時点で、数値または時間値を文字列に暗黙的に変換すると、およびcollation_connectionシステム変数によって決定される文字セットと照合を持つ値が生成されます。(これらの変数は通常、 で設定されSET NAMESます。接続文字セットの詳細については、セクション10.1.4「接続文字セットと照合順序」</a>を参照してください。)

この変更は、接続文字セットが に設定されている場合を除き、このような変換の結果が文字 (非バイナリ) 文字列 (CHARVARCHAR、または値) になることを意味します。その場合、変換結果はバイナリ文字列 ( 、、または値) になります。LONGTEXTbinaryBINARYVARBINARYLONGBLOB

MySQL 5.5.3 より前では、暗黙的な変換は、接続文字セットに関係なく、常にバイナリ文字列を生成していました。このような文字列への暗黙的な変換は、通常、文字列値がより一般的である場合に数値または時間値が渡される関数に対して発生するため、変換された値の型を超えた影響を与える可能性があります。

したがって、 5.5.3 より前のバージョンの MySQL を使用している場合、演算子をTIMESTAMP使用するときに発生する列の文字列への暗黙的な変換は、常に文字セットの文字列になります(不思議なことに、これは sqlfiddle の場合でもあります)。 、5.5.20 であると主張している); このような文字列は文字セットの文字列と比較できないため、列を明示的にUTF-8 文字列に変換する必要があります。LIKEbinarySET 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 に答える