Befestigungs Codierungen
-
26-09-2019 - |
Frage
Ich habe mit verkorksten Zeichencodierungen in einem unseren mysql Spalten gelandet ist.
Normalerweise habe ich
v © statt é
v? statt ö
v ? statt í
und so weiter ...
Ziemlich sicher, dass jemand hier würde wissen, was passiert ist und wie sie zu beheben.
UPDATE: Basierend auf Antwort des bobince und da ich diese Daten in einer Datei hatte ich habe folgende
#!/user/bin/env python
import codecs
f = codecs.open('./file.csv', 'r', 'utf-8')
f2 = codecs.open('./file-fixed.csv', 'w', 'utf-8')
for line in f:
f2.write(line.encode('macroman').decode('utf-8')),
nach der
load data infile 'file-fixed.csv'
into table list1
fields terminated by ','
optionally enclosed by '"'
ignore 1 lines;
die Daten korrekt importiert.
UPDATE2: Hammerite, nur für hier Vollständigkeit sind die angeforderten Details ...
mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
Die SHOW CREATE TABLE
für die Tabelle I am Import hat DEFAULT CHARSET=utf8
EDIT3:
Eigentlich mit den oben genannten Einstellungen der load
haben nicht , das Richtige tun (ich konnte nicht an bestehenden utf8 Felder vergleichen und meine geladenen Daten nur sieht , als wäre es korrekt geladen; ich nehme an, weil das falsch, aber passendes Client, den Anschluss und Ergebnisse charsets), so dass ich die Einstellungen aktualisiert:
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
Daten wieder hochgeladen und dann schließlich bekam ich die Daten korrekt geladen (vergleichbar mit vorhandenen Daten).
Lösung
Ihr Text wurde in UTF-8 codiert und dann wieder decodiert wird, fälschlicherweise als Mac Roman .
Sie werden diese nicht in der Datenbank in der Lage zu beheben, wie MySQL nicht den Mac Roman Codierung wissen. Sie können ein Skript schreiben, um jede Zeile jeder betroffenen Tabelle zu gehen und den Text durch Umkehrung der Encoder / Decoder-Zyklus zu reparieren. Python ist eine Möglichkeit, eine gute Auswahl an Codierungen mit:
>>> print u'é'.encode('macroman').decode('utf-8')
é
>>> print u'ö'.encode('macroman').decode('utf-8')
ö
>>> print u'í'.encode('macroman').decode('utf-8')
í
Alternativ, wenn es keine Nicht-ASCII-Inhalte, die von diesem Problem nicht betroffen ist, könnten Sie versuchen mysqladmin
mit einem SQL-Dump zu exportieren, dann wandelt sie alle auf einmal, entweder mit einem Skript wie oben oder, falls Sie eine haben Texteditor (vermutlich auf dem Mac), die es tun können, um das Skript als UTF-8 Laden dann als Mac Roman zu speichern. Schließlich Re-Import der Dump mit mysql < dump.sql
.