5
mysql> SELECT LOCATE("n", "München") COLLATE utf8_general_ci;
ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'binary'

このエラーを取り除くにはどうすればよいですか?

私がすでに試したこと(コピー&ペースト):

$ mysql -u admin -p $DATABASE
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.69 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT LOCATE("n", "München") COLLATE utf8_general_ci;
ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'binary'
mysql> SET NAMES utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT LOCATE("n", "München") COLLATE utf8_general_ci;
ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'binary'
mysql> SELECT LOCATE(_utf8"n", _utf8"München") COLLATE utf8_general_ci;
ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'binary'
mysql> SHOW VARIABLES LIKE "character_set_database";
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| character_set_database | utf8  |
+------------------------+-------+
1 row in set (0.00 sec)
4

3 に答える 3

2

COLLATE私の例のは、 の戻り値の 照合を設定しLOCATE、その結果は 型binaryです。

引数の照合を設定するには:

mysql> SELECT LOCATE(_utf8"n" COLLATE utf8_general_ci,
                     _utf8"München" COLLATE utf8_general_ci) AS locate;
+--------+
| locate |
+--------+
|      3 |
+--------+
1 row in set (0.00 sec)

私の動機は、部分文字列を検索するときに MySQL が照合を考慮しているかどうかを調べることでした。残念ながらそうではありませ 。2 番目のコマンドの結果を確認します。

mysql> SELECT LOCATE(_utf8"ü" COLLATE utf8_general_ci,
                     _utf8"München" COLLATE utf8_general_ci) AS locate;
+--------+
| locate |
+--------+
|      2 |
+--------+
1 row in set (0.00 sec)

mysql> SELECT LOCATE(_utf8"u" COLLATE utf8_general_ci,
                     _utf8"München" COLLATE utf8_general_ci) AS locate;
+--------+
| locate |
+--------+
|      0 |
+--------+
1 row in set (0.00 sec)

WHERE一時テーブルでテストします (照合は句で 考慮されますが、では考慮されませんLOCATE):

mysql> CREATE TEMPORARY TABLE test
       (text VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO test VALUES("München");
Query OK, 1 row affected (0.00 sec)

mysql> SELECT text FROM test WHERE text LIKE "%u%";
+---------+
| text    |
+---------+
| München |
+---------+
1 row in set (0.00 sec)

mysql> SELECT LOCATE("u", text) AS locate FROM test WHERE text LIKE "%u%"; 
+--------+
| locate |
+--------+
|      0 |
+--------+
1 row in set (0.01 sec)
于 2013-05-23T11:16:42.713 に答える
2

サーバーがデフォルトの文字セットbinaryでコンパイルされているため、文字列リテラルがそのように解釈されているか、サーバーとの通信時にクライアントがバイナリ モードを使用するように設定されている可能性があります。を呼び出して、クライアントと接続の文字セットを変更できますSET NAMES utf8(ただし、SQL ステートメントが PHP から発行されている場合、PHP には接続文字セットを設定するための独自のコマンドがあるため、これはお勧めできません)。MySQL リファレンス マニュアルの接続文字セットと照合順序を参照してください。

あるいは、「introducers」を使用して、 LOCATE関数で文字列リテラルに使用される文字セットを明示的に指定できます。たとえば、次のようになります。

LOCATE(_utf8"n", _utf8"München")

詳細については、リファレンス マニュアル ページのCharacter String Literal Character Set and Collat​​ionを参照してください。

于 2013-05-22T18:35:10.893 に答える