MySQL конвертировать данные из латиницы в UTF8 - PullRequest
8 голосов
/ 17 сентября 2009

Я импортировал некоторые данные, используя LOAD DATA INFILE, в базу данных MySQL. Сама таблица и столбцы используют набор символов UTF8, но набор символов по умолчанию для базы данных - латиница 1. Поскольку тип символов по умолчанию для базы данных - латинский, и я использовал LOAD DATA INFILE без указания набора символов, он интерпретировал файл как latin1, хотя данные в файле были UTF8. Теперь у меня есть куча плохо закодированных данных в моем столбце UTF8. Я нашел эту статью , которая, кажется, решает похожую проблему: «UTF8 вставлен в cp1251», но моя проблема - «Latin1 вставлена ​​в UTF8». Я попытался отредактировать запросы там, чтобы преобразовать данные латиницы в UTF8, но не могу заставить их работать. Либо данные получаются такими же, либо даже более искаженными, чем раньше. В качестве примера слово Québec показано как Québec.

[ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ]

При выборе данных, заключенных в HEX (), значение Quà © bec имеет значение 5175C383C2A9626563.

Создать таблицу (сокращено) этой таблицы.

CREATE TABLE MyDBName.`MyTableName`
(
`ID` INT NOT NULL AUTO_INCREMENT, 
.......
`City` CHAR(32) NULL, 
.......
`)) ENGINE InnoDB CHARACTER SET utf8;

Ответы [ 7 ]

11 голосов
/ 21 декабря 2009

У меня были случаи, подобные этому в старых установках WordPress, с проблемой, состоящей в том, что сами данные уже были в UTF-8 в базе данных Latin1 (из-за кодировки WP по умолчанию). Это означает, что не было никакой необходимости в преобразовании данных, кроме форматов ddbb и table. По моему опыту, при создании дампа все портится, так как я понимаю, что MySQL будет использовать клиентский набор символов по умолчанию, который во многих случаях теперь является UTF-8. Поэтому очень важно убедиться, что экспорт с одинаковой кодировкой данных очень важен. В случае Latin1 DDBB с кодировкой UTF-8:

$ mysqldump –default-character-set=latin1 –databases wordpress > m.sql

Затем замените ссылки Latin1 в экспортированном дампе перед повторным импортом в новую базу данных в UTF-8. Сортировка:

$ replace "CHARSET=latin1" "CHARSET=utf8" \
    "SET NAMES latin1" "SET NAMES utf8" < m.sql > m2.sql

В моем случае эта ссылка очень помогла. Прокомментировал здесь на испанском .

7 голосов
/ 17 января 2012

Хотя это вряд ли актуально для OP, я случайно нашел решение в документации MySQL для ALTER TABLE . Я размещаю это здесь только для будущего использования:

Внимание

Операция CONVERT TO преобразует значения столбцов между наборами символов. Это не то, что вам нужно, если у вас есть столбец в одном наборе символов (например, latin1), но сохраненные значения на самом деле используют другой несовместимый набор символов (например, utf8). В этом случае вы должны сделать следующее для каждого такого столбца:

ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;

Причина, по которой это работает, заключается в том, что при преобразовании в столбцы BLOB или из столбцов преобразование не выполняется.

2 голосов
/ 27 декабря 2009

Я написал, что http://code.google.com/p/mysqlutf8convertor/ для латинской базы данных в базе данных UTF-8. Все таблицы и поля для изменения UTF-8.

2 голосов
/ 17 сентября 2009

LOAD DATA INFILE позволяет установить кодировку файла, который должен быть в:

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

1 голос
/ 21 марта 2013

Я недавно выполнил сценарий оболочки, который автоматизирует процесс преобразования. Также можно настраивать написание пользовательских фильтров для любого текста, который вы хотите заменить или удалить. Например: удаление символов HTML и т. Д. Также возможны белые и черные списки таблиц. Вы можете скачать его на sourceforge: https://sourceforge.net/projects/mysqltr/

1 голос
/ 17 сентября 2009

Преобразование латиницы 1 в UTF8 - это не то, что вы хотите, вам нужно наоборот.

Если то, что действительно произошло, было так:

  1. Строки UTF-8 были интерпретированы как Latin-1 и перекодированы в UTF-8, искажая их.
  2. Вы сейчас читаете строки UTF-8 без возможности их интерпретации.

Что вы должны сделать сейчас:

  1. Считайте "UTF-8" без транскодирования.
  2. Конвертировать в Latin-1. Теперь у вас должен быть оригинальный UTF-8.
  3. Теперь поместите его в столбец «UTF-8» без дальнейшей конвертации.
0 голосов
/ 16 мая 2012

Попробуйте это:

1) Дамп вашей БД

mysqldump --default-character-set=latin1 -u username -p databasename < dump.sql

2) Откройте dump.sql в текстовом редакторе и замените все вхождения «SET NAMES latin1» на «SET NAMES utf8»

3) Создайте новую базу данных и восстановите файл дампа

cat dump.sql | mysql -u root -p newdbname
...