MySQL Konvertiere latin1 Daten in UTF8

8

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%     
Kibbee 17.09.2009, 19:20
quelle

7 Antworten

11

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 .

    
luison 21.12.2009 12:42
quelle
7

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:

  

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:

%Vor%
  

Der Grund dafür ist, dass bei der Konvertierung in oder aus BLOB-Spalten keine Konvertierung stattfindet.

    
newtover 17.01.2012 16:52
quelle
2

LOAD DATA INFILE ermöglicht es Ihnen, eine Encoding-Datei einzustellen, in der sich befinden soll:

Ссылка

    
Vladislav Rastrusny 17.09.2009 19:46
quelle
2

Ich habe Ссылка für die Datenbank "Latin Database to UTF-8" geschrieben. Alle Tabellen und Felder zum Ändern von UTF-8.

    
saturngod 27.12.2009 04:16
quelle
1

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:

  1. UTF-8-Strings wurden als Latin-1 interpretiert und in UTF-8 transkodiert, wodurch sie fehlten.
  2. Sie können oder könnten UTF-8-Strings ohne weitere Interpretation lesen

Was Sie jetzt tun müssen, ist:

  1. Lesen Sie den "UTF-8" ohne Transcodierung.
  2. Konvertiere es in Latein-1. Jetzt sollten Sie eigentlich das Original UTF-8 haben.
  3. Versetzen Sie es jetzt in Ihre Spalte "UTF-8" ohne weitere Konvertierung.
DigitalRoss 17.09.2009 19:35
quelle
1

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: Ссылка

    
user2192857 20.03.2013 21:36
quelle
0

Versuchen Sie Folgendes:

1) Dump your DB

%Vor%

2) Öffne dump.sql im Texteditor und ersetze alle Vorkommen von "SET NAMES latin1" durch "SET NAMES utf8"

3) Erstellen Sie eine neue Datenbank und stellen Sie Ihre Dump-Datei wieder her

%Vor%     
François 16.05.2012 15:36
quelle