Ich erhalte 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 dieses Problem zu beheben? Kann ich der Zeichenfolge irgendwie entkommen, damit dieser Fehler nicht auftritt, oder muss ich meine Tabellencodierung irgendwie ändern, und wenn ja, in was soll ich sie ändern?
mysql
sql
mysql-error-1267
Klicken Sie auf Upvote
quelle
quelle
Antworten:
dann für Ihre Datenbanken
MySQL schleicht sich dort manchmal ohne vernünftigen Grund schwedisch ein.
quelle
Sie sollten sowohl Ihre Tabellencodierung als auch Ihre Verbindungscodierung auf Folgendes einstellen
UTF-8
:und
quelle
myDb
DEFAULT CHARACTER SET utf8 COLLATE utf8_bin. Funktioniert das? Dies geschieht so, dass alle meine Tabellen betroffen sind, nicht nur eineLöst mein Problem. Wobei Spalte1 die Spalte ist, die mir diesen Fehler gibt.
quelle
Verwenden Sie die folgende Anweisung für Fehler
Seien Sie vorsichtig, wenn Ihre Daten gesichert werden, wenn die Daten in der Tabelle enthalten sind.
quelle
Im Allgemeinen ist es am besten, die Tabellensortierung zu ändern. Ich habe jedoch eine alte Anwendung und kann das Ergebnis nicht wirklich abschätzen, ob dies Nebenwirkungen hat. Deshalb habe ich irgendwie versucht, den String in ein anderes Format zu konvertieren, das das Sortierproblem gelöst hat. Was ich als funktionierend empfunden habe, ist das Vergleichen der Zeichenfolge, indem die Zeichenfolgen in eine hexadezimale Darstellung der Zeichen konvertiert werden. In der Datenbank geschieht dies mit
HEX(column).
Für PHP können Sie diese Funktion verwenden:Bei der Datenbankabfrage muss Ihre ursprüngliche UTF8-Zeichenfolge zuerst in eine ISO-Zeichenfolge konvertiert werden (z. B.
utf8_decode()
in PHP), bevor sie in der Datenbank verwendet wird . Aufgrund des Sortierungstyps kann die Datenbank keine UTF8-Zeichen enthalten, sodass der Vergleich funktionieren sollte, obwohl dies die ursprüngliche Zeichenfolge ändert (das Konvertieren von UTF8-Zeichen, die im ISO-Zeichensatz nicht vorhanden sind, führt zu einem? Oder diese werden vollständig entfernt). Stellen Sie einfach sicher, dass Sie beim Schreiben von Daten in die Datenbank dieselbe Konvertierung von UTF8 in ISO verwenden.quelle
Ich hatte meine Tabelle ursprünglich mit CHARSET = latin1 erstellt . Nach der Tabellenkonvertierung in utf8 wurden einige Spalten nicht konvertiert, was jedoch nicht wirklich offensichtlich war. Sie können versuchen, auszuführen
SHOW CREATE TABLE my_table;
und zu sehen, welche Spalte nicht konvertiert wurde, oder einfach den falschen Zeichensatz in der problematischen Spalte mit der folgenden Abfrage korrigieren (ändern Sie die varchar-Länge und CHARSET und COLLATE entsprechend Ihren Anforderungen):quelle
Ändern Sie den Zeichensatz der Tabelle in utf8
quelle
Ändern Sie die Standardeinstellungen Ihres Servers, nachdem Sie die in der oberen Antwort aufgeführten Korrekturen vorgenommen haben.
Fügen Sie in Ihrem " /etc/my.cnf.d/server.cnf " oder wo immer es sich befindet, die Standardeinstellungen zum Abschnitt [mysqld] hinzu, damit es so aussieht:
Quelle: https://dev.mysql.com/doc/refman/5.7/en/charset-applications.html
quelle
Ich fand, dass die Verwendung
cast()
die beste Lösung für mich war:Es gibt auch eine
convert()
Funktion. Weitere Details dazu hierEine weitere Ressource hier
quelle
Mein Benutzerkonto hatte nicht die Berechtigung, die Datenbank und die Tabelle zu ändern, wie in dieser Lösung vorgeschlagen .
Wenn Sie sich wie ich nicht um die Zeichensortierung kümmern (Sie verwenden den Operator '='), können Sie den umgekehrten Fix anwenden. Führen Sie dies aus, bevor Sie SELECT:
quelle