2009-06-17 6 views
80

ich diesen seltsamen Fehler erhalten, während eine große Anzahl von Datenverarbeitung ...Illegal Mix von Sortierungen MySQL Fehlern

Error Number: 1267 

Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=' 

SELECT COUNT(*) as num from keywords WHERE campaignId='12' AND LCASE(keyword)='hello again 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€' 

Was kann ich tun, um dies zu lösen? Kann ich die Zeichenfolge irgendwie umgehen, damit dieser Fehler nicht auftritt, oder muss ich meine Tabellencodierung irgendwie ändern, und wenn ja, in was soll ich sie ändern?

+0

dieser Fehler, es ist eine injizierbare oder nicht? –

Antwort

192
SET collation_connection = 'utf8_general_ci'; 

dann für Ihre Datenbanken

ALTER DATABASE your_database_name CHARACTER SET utf8 COLLATE utf8_general_ci; 

ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

schleicht MySQL ohne vernünftigen Grund dort manchmal schwedisch.

+2

funktioniert wie ein Charme :) –

+1

Fantastischer Freund. es funktioniert super. Vielen Dank. – Sagotharan

+3

@Ben: Vielen Dank für eine direkt kopierfähige Lösung. Sparte mir viel Zeit. – Pistos

8

Sie sollten sowohl Ihre Tabelle Codierung und Verbindungs ​​Codierung UTF-8 gesetzt:

ALTER TABLE keywords CHARACTER SET UTF8; -- run once 

und

SET NAMES 'UTF8'; 
SET CHARACTER SET 'UTF8'; 
+0

Sind beide notwendig, oder kann ich nur einen von ihnen machen? –

+0

ALTER DATENBANK 'myDb' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin. Funktioniert das? Dies geschieht, damit es alle meine Tabellen betrifft, nicht nur eine davon –

+1

ALTER DATABASE wird Ihre aktuellen Tabelleneinstellungen nicht ändern, nur neu erstellte. Es wird jedoch nicht schaden, den Standard-Zeichensatz für die Datenbank zu ändern. – Quassnoi

-1

Im Allgemeinen ist der beste Weg ist, um die Tabelle Sortierung zu ändern. Allerdings habe ich eine alte Anwendung und bin nicht wirklich in der Lage, das Ergebnis abzuschätzen, ob dies Nebenwirkungen hat. Daher habe ich versucht, die Zeichenfolge irgendwie in ein anderes Format zu konvertieren, das das Kollationsproblem löste. Was ich gefunden habe funktioniert, um den String zu vergleichen, indem Sie die Zeichenfolgen in eine hexadezimale Darstellung seiner Zeichen konvertieren. Auf der Datenbank dies mit HEX(column). Für PHP getan wird Sie diese Funktion nutzen zu können:

public static function strToHex($string) 
{ 
    $hex = ''; 
    for ($i=0; $i<strlen($string); $i++){ 
     $ord = ord($string[$i]); 
     $hexCode = dechex($ord); 
     $hex .= substr('0'.$hexCode, -2); 
    } 
    return strToUpper($hex); 
} 

Wenn dabei die Datenbankabfrage, Ihr ursprünglicher UTF8-String muss zunächst in einen ISO-String umgewandelt werden (zB mit utf8_decode() in PHP) vor der Verwendung es in der DB. Aufgrund des Überprüfungstypen kann die Datenbank nicht UTF8 Zeichen innen so sollte die comparism Veranstaltung arbeiten, obwohl diese die ursprünglichen Zeichenfolge (Umwandlung von UTF8-Zeichen, die nicht in dem ISO-charset Ergebnis in einem existend werden? Oder diese wird entfernt vollständig) ändert. Stellen Sie nur sicher, dass Sie beim Schreiben von Daten in die Datenbank dieselbe UTF8-zu-ISO-Konvertierung verwenden.

0

Ich hatte meine Tabelle ursprünglich erstellt mit CHARSET = latin1. Nach Tabelle Umstellung auf utf8 einige Spalten nicht umgesetzt wurden, war aber das ist nicht wirklich klar. Sie können versuchen, SHOW CREATE TABLE my_table; und sehen zu laufen, welche Spalte nicht konvertiert wurde oder einfach nur falsche Zeichen auf problematische Spalte mit Abfrage nachstehenden fixieren (ändern varchar Länge und CHARSET und COLLATE nach Bedarf):

ALTER TABLE `my_table` CHANGE `my_column` `my_column` VARCHAR(10) CHARSET utf8 
COLLATE utf8_general_ci NULL; 
1

Verwenden folgende Erklärung für Fehler

vorsichtig sein, über Ihre Datensicherung übernehmen, wenn die Daten in der Tabelle haben.

 ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
Verwandte Themen