web-dev-qa-db-de.com

Ungültige Mischung von Sortierungen MySQL-Fehler

Ich bekomme diesen seltsamen Fehler beim Verarbeiten 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 das Problem zu lösen? Kann ich die Zeichenfolge irgendwie umgehen, damit dieser Fehler nicht auftritt, oder muss ich meine Tabellencodierung irgendwie ändern, und wenn ja, wo muss ich sie ändern?

104
Click Upvote
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.

247
Ben Hughes

Sie sollten sowohl Ihre Tabellenkodierung als auch die Verbindungskodierung auf UTF-8 setzen:

ALTER TABLE keywords CHARACTER SET UTF8; -- run once

und

SET NAMES 'UTF8';
SET CHARACTER SET 'UTF8';
12
Quassnoi
CONVERT(column1 USING utf8)

Löst mein Problem Dabei ist Spalte1 die Spalte, die diesen Fehler angibt.

7
Binaya Shrestha

Verwenden Sie die folgende Anweisung für Fehler 

seien Sie vorsichtig, wenn Ihre Daten gesichert werden, wenn Daten in der Tabelle enthalten sind.

  ALTER TABLE Ihr_Tabellenname CONVERT IN CHARACTER SET utf8 COLLATE utf8_general_ci;
2
vpgodara

Ändern Sie den Zeichensatz der Tabelle in utf8

ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8

0

Nachdem Sie Ihre Korrekturen in der obersten Antwort aufgeführt haben, ändern Sie die Standardeinstellungen Ihres Servers.

Fügen Sie in Ihrem "/etc/my.cnf.d/server.cnf" oder wo immer er sich befindet, die Standardwerte zum Abschnitt [mysqld] hinzu, so dass es so aussieht:

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

Quelle: https://dev.mysql.com/doc/refman/5.7/de/charset-applications.html

0
ITI

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 offensichtlich war. Sie können versuchen, SHOW CREATE TABLE my_table; auszuführen und zu sehen, welche Spalte nicht konvertiert wurde, oder einfach den fehlerhaften Zeichensatz in der problematischen Spalte mit der Abfrage unten zu korrigieren (ändern Sie die Varchar-Länge und CHARSET und COLLATE entsprechend Ihren Anforderungen):

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

Im Allgemeinen ist es am besten, die Tabellensortierung zu ändern. Ich habe jedoch eine alte Anwendung und kann das Ergebnis nicht wirklich einschätzen, ob dies Nebenwirkungen hat. Daher habe ich versucht, die Zeichenfolge irgendwie in ein anderes Format zu konvertieren, das das Kollatierungsproblem gelöst hat. Was ich als funktionierend empfinde, war, den Zeichenfolgenvergleich durchzuführen, indem die Zeichenfolgen in eine hexadezimale Darstellung der Zeichen umgewandelt wurden. In der Datenbank wird dies mit HEX(column). gemacht. 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 der ursprüngliche UTF8-String zuerst in einen Iso-String konvertiert werden (z. B. mit utf8_decode() in PHP), bevor er in der DB verwendet wird. Aufgrund des Kollatierungstyps kann die Datenbank keine UTF8-Zeichen enthalten. Das Vergleichsereignis sollte funktionieren. Dies ändert jedoch die ursprüngliche Zeichenfolge (das Konvertieren von UTF8-Zeichen, die nicht im ISO-Zeichensatz vorhanden sind, führt zu einem? 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.

0
Stephan