2010-09-29 4 views
2

Я закончил с испорченными символьными кодировками в одном из наших столбцов 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/ | 
+--------------------------+----------------------------+ 

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

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

+0

Какую кодировку используете в настоящее время? Как вставлять данные? – NullUserException

+0

Echoing NullUserException, пожалуйста, опубликуйте вывод 'SHOW CREATE TABLE TableName'.Также опубликуйте вывод 'SHOW VARIABLES LIKE 'character_set%''. – Hammerite

+0

@Hammerite, NullUserException, спасибо за ваш вклад ... – Unreason

ответ

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

+0

Спасибо, сэр ... Я обновляю вопрос с помощью решения; У меня были данные в файле на самом деле – Unreason