Ich habe einige Daten mit LOAD DATA INFILE in eine MySQL Datenbank importiert. Die Tabelle selbst und die Spalten verwenden den UTF8-Zeichensatz, aber der Standardzeichensatz der Datenbank ist lateinisch 1. Da der Standardzeichentyp der Datenbank latin1 ist und ich LOAD DATA INFILE ohne Angabe eines Zeichensatzes verwendete, wurde er interpretiert die Datei als latin1, obwohl die Daten in der Datei UTF8 waren. Jetzt habe ich eine Menge schlecht kodierter Daten in meiner UTF8-Kolumne. Ich fand diesen Artikel , der ein ähnliches Problem zu lösen scheint , das ist "UTF8 in cp1251 eingefügt", aber mein Problem ist "Latin1 in UTF8 eingefügt". Ich habe versucht, die Abfragen dort zu bearbeiten, um die latin1-Daten in UTF8 zu konvertieren, aber es kann nicht funktionieren. Entweder kommen die Daten gleich oder noch schlechter als zuvor. Als Beispiel zeigt sich das Wort Québec als Québec.
[WEITERE INFORMATIONEN]
Wenn Sie die in HEX () verpackten Daten auswählen, hat Québec den Wert 5175C383C2A9626563.
Die Create Table (verkürzt) dieser Tabelle ist.
%Vor%Ich hatte Fälle wie diese in alten Wordpress-Installationen mit dem Problem, dass die Daten selbst in UTF-8 in einer Latin1-Datenbank waren (aufgrund des WP-Standard-Zeichensatzes). Dies bedeutet, dass keine echte Konvertierung der Daten erforderlich war, sondern die Formate ddbb und table. Meiner Erfahrung nach werden die Dinge bei der Ausführung des Dump durcheinander gebracht, da ich weiß, dass MySQL den Standardzeichensatz des Clients verwenden wird, der in vielen Fällen jetzt UTF-8 ist. Stellen Sie daher sicher, dass der Export mit der gleichen Codierung der Daten sehr wichtig ist. Im Fall von Latin1 DDBB mit UTF-8-Codierung:
%Vor%Ersetzen Sie dann die Latin1-Referenzen innerhalb des exportierten Dumps, bevor Sie sie in UTF-8 erneut in eine neue Datenbank importieren. Irgendwie:
%Vor%In meinem Fall war dieser Link eine große Hilfe. Kommentierte hier in Spanisch .
Obwohl es für das OP kaum noch aktuell ist, habe ich zufällig eine Lösung in der MySQL-Dokumentation für ALTER TABELLE . Ich poste es hier nur für zukünftige Referenz:
%Vor%Warnung
Die Operation CONVERT TO konvertiert Spaltenwerte zwischen den Zeichensätzen. Dies ist nicht das, was Sie wollen, wenn Sie eine Spalte in einem Zeichensatz haben (wie latin1), aber die gespeicherten Werte tatsächlich einen anderen, inkompatiblen Zeichensatz verwenden (wie utf8). In diesem Fall müssen Sie für jede dieser Spalten Folgendes tun:
Der Grund dafür ist, dass bei der Konvertierung in oder aus BLOB-Spalten keine Konvertierung stattfindet.
LOAD DATA INFILE ermöglicht es Ihnen, eine Encoding-Datei einzustellen, in der sich befinden soll:
Das Konvertieren von latin1 in UTF8 ist nicht das, was Sie tun möchten, Sie brauchen das Gegenteil.
Wenn was wirklich passiert ist, war das:
Was Sie jetzt tun müssen, ist:
Ich habe kürzlich ein Shell-Skript abgeschlossen, das den Konvertierungsprozess automatisiert. Es ist auch konfigurierbar, um benutzerdefinierte Filter für jeden Text zu schreiben, den Sie ersetzen oder entfernen möchten. Zum Beispiel: Abstreifen von HTML-Zeichen usw. Es sind auch Table-Whitelists und Blacklists möglich. Sie können es bei sourceforge herunterladen: Ссылка
Tags und Links sql mysql collation load-data-infile