utf8mb4_general_ci - php mysql illegal mix of collations




Illegale Mischung von Kollatierungen MySQL Fehler (5)

Ich hatte meine Tabelle ursprünglich mit CHARSET = latin1 erstellt . Nach der Konvertierung der Tabelle in utf8 wurden einige Spalten nicht konvertiert, was jedoch nicht wirklich offensichtlich war. Sie können versuchen, SHOW CREATE TABLE my_table; und sehen Sie, welche Spalte nicht konvertiert wurde oder korrigieren Sie einfach den falschen Zeichensatz in der problematischen Spalte mit der Abfrage unten (ändern Sie varchar length und CHARSET und COLLATE entsprechend Ihren Bedürfnissen):

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

Ich bekomme diesen seltsamen Fehler während der Verarbeitung einer großen Anzahl von Daten ...

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 beheben? 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?


Im Allgemeinen ist der beste Weg, die Tabellenkollation 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, ist, den Zeichenkettenvergleich durchzuführen, indem ich die Zeichenfolgen in eine hexadezimale Darstellung der Zeichen umwandle. In der Datenbank erfolgt dies mit HEX(column). Für PHP können Sie diese Funktion verwenden:

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);
}

Bei der Datenbankabfrage muss Ihre ursprüngliche UTF8-Zeichenfolge zuerst in eine Iso-Zeichenfolge konvertiert werden (z. B. mithilfe von utf8_decode() in PHP), bevor Sie sie in der Datenbank verwenden. Aufgrund des Sortierungstyps kann die Datenbank keine UTF8-Zeichen enthalten, so dass der Vergleich funktionieren sollte, obwohl dies die ursprüngliche Zeichenfolge ändert (die Konvertierung von UTF8-Zeichen, die im ISO-Zeichensatzergebnis nicht enthalten sind, oder diese werden vollständig entfernt). Stellen Sie nur sicher, dass Sie beim Schreiben von Daten in die Datenbank dieselbe UTF8-zu-ISO-Konvertierung verwenden.


Sie sollten sowohl Ihre Tabellencodierung als auch die Verbindungscodierung auf UTF-8 :

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

und

SET NAMES 'UTF8';
SET CHARACTER SET 'UTF8';

Verwenden Sie die folgende Anweisung für den Fehler

Seien Sie vorsichtig bei Ihren Daten, nehmen Sie ein Backup, wenn Daten in der Tabelle enthalten sind.

 ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

SET collation_connection = 'utf8_general_ci';

dann für deine 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;

MySQL schleicht schwedisch manchmal ohne vernünftigen Grund dorthin.





mysql-error-1267