Фиксация кодировок

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

Обычно у меня

√ © вместо é
√∂ вместо ö
√ ≠ вместо í

и т.д.

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

UPDATE: Основанный на ответе 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;

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

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

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

Ваш текст был закодирован в UTF-8, а затем повторно декодирован, ошибочно, как Mac Roman.

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