Исправление кодировок - PullRequest
       9

Исправление кодировок

2 голосов
/ 29 сентября 2010

В результате мы получили испорченные кодировки символов в одном из наших столбцов mysql.

Как правило, вместо é
√∂ вместо ö
вместо *1005* √ ©√ ≠ вместо í

и так далее ...

Достоверно уверен, что кто-то здесь будет знать, что случилось и как исправить.

ОБНОВЛЕНИЕ: Основываясь на ответе Бобинса, и, поскольку у меня были эти данные в файле, я сделал следующее:

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

правильно импортировал данные.

UPDATE2: 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 и только мои загруженные данные выглядел , как будто он был загружен правильно; я полагаю, из-за неправильного , но совпадающего клиента, соединениеd приводит наборы символов), поэтому я обновил настройки:

+--------------------------+----------------------------+
| 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/ | 
+--------------------------+----------------------------+

снова загрузил данные, а затем, наконец, я загрузил данные правильно (сопоставимо с существующими данными).

1 Ответ

5 голосов
/ 29 сентября 2010

Ваш текст был закодирован в 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затем конвертируйте все сразу, либо используя скрипт, как указано выше, либо, если у вас есть текстовый редактор (предположительно на Mac), который может это сделать, загрузив скрипт как UTF-8 и сохранив его как Mac Roman.Наконец, повторно импортируйте дамп, используя mysql < dump.sql.

...