Вопрос

Я оказался запутанным кодировками персонажа в одном из наших столбцов 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;

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

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

Редактировать3:

На самом деле с вышеуказанными настройками load не сделать правильно (я не мог сравниться с существующими полями UTF8, а также мои загруженные данные смотрел Как будто он был загружен правильно; Я предполагаю, из-за неправильно, но соответствие Клиент, подключение и результаты Charsets), поэтому я обновил настройки:

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

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

Это было полезно?

Решение

Ваш текст был закодирован на 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top