2

mysql 列の 1 つで文字エンコーディングが台無しになってしまいました。

通常、私は持っています

é の代わりに √©
ö の代わりに √∂
í の代わりに √≠

等々...

ここにいる誰かが何が起こったのか、どのように修正するのかを知っていることはかなり確実です.

更新: ボビンスの回答に基づいて、このデータをファイルに保存していたので、次のことを行いました

#!/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

EDIT3:

実際、上記の設定では正しいことを行い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/ | 
+--------------------------+----------------------------+

データを再度アップロードし、最終的にデータを正しくロードしました (既存のデータと同等)。

4

1 に答える 1

5

テキストは UTF-8 にエンコードされた後、誤ってMac Romanとして再デコードされました。

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 ダンプをエクスポートしてから、上記のスクリプトを使用するか、テキスト エディター (おそらくスクリプトを UTF-8 としてロードし、Mac Roman として保存します。最後に、 を使用してダンプを再インポートしmysql < dump.sqlます。

于 2010-09-29T17:10:04.547 に答える