2013-05-22 9 views
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' 

Jak pozbyć się tego błędu?COLLATION 'utf8_general_ci' jest nieprawidłowe dla CHARACTER SET 'binary'?

Co ja już próbowałem (kopiuj & pastę):

$ 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) 

Odpowiedz

2

Być może serwer został skompilowany z domyślnego zestawu znaków z binarnym, tak że literały ciągów znaków są interpretowane jako takie, czy klient jest ustawiony do używania trybu binarnego podczas komunikacji z serwerem. Możesz zmienić klienta i zestaw znaków połączenia, wywołując SET NAMES utf8 (choć nie jest to zalecane, jeśli twoje instrukcje SQL są wydawane z PHP, na przykład, ponieważ PHP będzie miało swoje własne polecenia ustawiania zestawu znaków połączenia). Zobacz Connection Character Sets and Collations w podręczniku użytkownika MySQL.

Alternatywnie można użyć „wprowadzających”, aby określić jednoznacznie zestaw znaków używany do napisowych w swojej ZLOKALIZUJ funkcji, na przykład:

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

Zobacz stronę podręcznika odniesienia Character String Literal Character Set and Collation więcej szczegółów.

+0

Który stół? Moje zapytanie nie odwołuje się do tabeli. – feklee

+0

Przepraszam, na wpół śpię. Całkowicie zastąpiłem odpowiedź. – Bobulous

+0

Już przed zadawaniem pytania spróbowałem 'SET NAMES utf8', a teraz znowu, bez powodzenia. Wprowadzające * wyglądają jak dobre rozwiązanie, ale nie działają: komunikat o błędzie nie zniknął. Próbowałem: SELECT LOCATE (_utf8 "n", _utf8 "München") COLLATE utf8_general_ci' Przy okazji, używam bezpośrednio konsoli, aby się bawić. Uruchomiłem konsolę: 'mysql -u admin -p $ database' Właśnie uruchomiłem' show variables like "character_set_database" '.Wynik: 'utf8' – feklee

2

The COLLATE w moim przykładzie sets the collation of the return value z LOCATE, którego wynik jest typu binary.

Aby ustawić sortowanie argumentów:

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) 

Moja motywacja faktycznie było znalezienie się, czy MySQL wykonuje sortowanie pod uwagę przy poszukiwaniu podciągu. Niestety, nie ma to ani. Zobacz wynik drugiego polecenia:

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) 

test z tabeli tymczasowej (sortowania uwzględnione w WHERE klauzuli, ale nie w 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) 
0

Wiem, że to późno, ale Mam nadzieję, że to pomoże komuś. Ciągle robiłem ten sam błąd i wiedziałem, że moje zestawy znaków i sortowanie są w porządku.

Sprawdź symbole "@" w wyciągu, które nie należą. Przetestowałem moją zapisaną procedurę jako instrukcję select ze zmiennymi, a następnie podczas tworzenia przechowywanego procesu zapomniałem usunąć symbole "@". Nie trzeba dodawać, że czułem się bardzo głupio.

Wiem też, że nie wydaje się, że tak jest w tym pytaniu, ale to jest mój pierwszy wpis SO i nie mam wystarczającej liczby przedstawicieli, aby zrobić dużo więcej, więc przepraszam.