Исправление кодировок
Я закончил с испорченными кодировками символов в одной из наших колонок mysql.
Обычно у меня есть
√© вместо é
√∂ вместо ö
√ ≠ вместо í
и так далее...
Совершенно уверен, что кто-то здесь будет знать, что случилось и как исправить.
ОБНОВЛЕНИЕ: Основываясь на ответе Бобинса, и так как у меня были эти данные в файле, я сделал следующее
#!/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/ |
+--------------------------+----------------------------+
снова загрузил данные, а затем, наконец, я загрузил данные правильно (сопоставимо с существующими данными).
1 ответ
Ваш текст был закодирован в 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 Римский. Наконец, повторно импортируйте дамп, используя mysql < dump.sql
,