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

Wie kann ich diesen Fehler beheben?COLLATION 'utf8_general_ci' ist nicht gültig für CHARACTER SET 'binary'?

Was ich schon versucht (copy & Paste):

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

Antwort

2

Möglicherweise ist der Server mit einem Standardzeichensatz von binären kompiliert wurde, so dass Stringliterale als solche interpretiert werden, oder der Client ist so eingestellt, dass bei der Kommunikation mit dem Server ein binärer Modus verwendet wird. Sie können den Client und den Verbindungszeichensatz ändern, indem Sie SET NAMES utf8 aufrufen (dies wird jedoch nicht empfohlen, wenn Ihre SQL-Anweisungen zum Beispiel von PHP ausgegeben werden, da PHP eigene Befehle zum Setzen des Verbindungszeichensatzes haben wird). Siehe Connection Character Sets and Collations im MySQL-Referenzhandbuch.

Alternativ können Sie „Introducer“ verwenden ausdrücklich die charset für die Zeichenfolgenliterale in Ihrer LOCATE Funktion, zum Beispiel verwendet, um anzugeben:

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

siehe Referenzhandbuch Seite Character String Literal Character Set and Collation für weitere Details.

+0

Welche Tabelle? Meine Abfrage verweist nicht auf eine Tabelle. – feklee

+0

Entschuldigung, halb schlafend hier. Ich habe die Antwort vollständig ersetzt. – Bobulous

+0

Schon bevor ich die Frage gestellt habe, habe ich 'SET NAMES utf8' versucht, und nun wieder, ohne Erfolg. Die * Einsteiger * sehen wie eine nette Lösung aus, funktionieren aber nicht: Die Fehlermeldung bleibt bestehen. Ich habe versucht: 'SELECT LOCATE (_utf8" n ", _utf8" München ") COLLATE utf8_general_ci' Übrigens, ich benutze direkt die Konsole, um herumzuspielen. Ich startete die Konsole mit: mysql -u admin -p $ database Ich habe gerade 'show Variablen wie" character_set_database "' ausgeführt.Ergebnis: 'utf8' – feklee

2

Die COLLATE in meinem Beispiel sets the collation of the return value von LOCATE, wobei das Ergebnis davon ist vom Typ binary.

Um die Zusammenstellung der Argumente gesetzt:

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) 

Meine Motivation war zu finden, tatsächlich herauszufinden, ob MySQL die Sortierung berücksichtigt, wenn für die Teilkette zu suchen. Leider tut es nicht. Sehen Sie das Ergebnis des zweiten Befehls:

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 mit einer temporären Tabelle (Sortierungs berücksichtigt in WHERE Klausel, aber nicht in 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

Ich weiß, das spät ist, aber Ich hoffe es hilft jemandem. Ich bekam den gleichen Fehler und ich wusste, dass meine Charsets und Sortierungen in Ordnung waren.

prüfen ‚@‘ Symbole in Ihrer Erklärung, die nicht gehört. Ich habe meine gespeicherte Prozedur als Select-Anweisung mit Variablen getestet und dann beim Erstellen der gespeicherten Prozedur vergessen, die '@' Symbole zu entfernen. Unnötig zu sagen, dass ich mich sehr albern fühlte.

Ich weiß auch dies nicht der Fall in dieser Frage zu sein scheint, aber dies ist meine erste SO posten und ich habe nicht genug rep viel anderes zu tun, so dass ich entschuldige mich.

Verwandte Themen