エンコーディングの修正
-
26-09-2019 - |
質問
mysql 列の 1 つで文字エンコーディングがおかしくなってしまいました。
通常、私は持っています
é の代わりに √©
ö の代わりに √∂
í の代わりに √≠
等々...
ここにいる誰かが何が起こったのか、どう修正するかを知っているはずです。
アップデート:bobince の回答に基づいて、このデータがファイルにあったので、次のことを行いました
#!/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')),
その後
load data infile 'file-fixed.csv'
into table list1
fields terminated by ','
optionally enclosed by '"'
ignore 1 lines;
データは正しくインポートされました。
更新2:Hammerite、念のため、要求された詳細をここに示します...
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/ |
+--------------------------+----------------------------+
の SHOW CREATE TABLE
インポート先のテーブルには DEFAULT CHARSET=utf8
編集3:
実際に上記の設定を行うと、 load
しませんでした 正しいことをしてください(既存のutf8フィールドとロードされたデータのみと比較できませんでした) 見た あたかも正しくロードされたかのように;のせいだと思います 間違っていますが、一致しています クライアント、接続、結果の文字セット)のため、設定を次のように更新しました。
+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+
データを再度アップロードし、最終的にデータを正しくロードしました(既存のデータと比較可能)。
解決
テキストは UTF-8 にエンコードされ、その後、誤って次のように再デコードされました。 マックロマン.
MySQL は Mac Roman エンコーディングを認識しないため、データベース内でこれを修正することはできません。影響を受ける各テーブルの各行を調べ、エンコード/デコード サイクルを逆にしてテキストを修正するスクリプトを作成することもできます。Python はさまざまなエンコーディングを備えているため、可能性があります。
>>> print u'é'.encode('macroman').decode('utf-8')
é
>>> print u'ö'.encode('macroman').decode('utf-8')
ö
>>> print u'í'.encode('macroman').decode('utf-8')
í
あるいは、この問題の影響を受けない非 ASCII コンテンツがない場合は、次のコマンドを使用してみることもできます。 mysqladmin
SQL ダンプをエクスポートし、それをすべて一度に変換します。上記のようなスクリプトを使用するか、それを実行できるテキスト エディタ (おそらく Mac 上) がある場合は、スクリプトを UTF-8 としてロードして Mac として保存します。ローマ人。最後に、次を使用してダンプを再インポートします mysql < dump.sql
.