Это безопасный способ конвертировать таблицы MySQL из latin1 в utf-8? - PullRequest
10 голосов
/ 31 мая 2011

Мне нужно изменить все таблицы в одной из моих баз данных с latin1 на utf-8 (с сопоставлением utf8_bin).

Я сбросил базу данных, создал из нее тестовую базу данных и запустил следующее без каких-либо ошибок или предупреждений для каждой таблицы:

ALTER TABLE tablename CONVERT TO CHARSET utf8 COLLATION utf8_bin

Безопасно ли мне повторять это на реальной базе данных? Данные кажутся хорошими при проверке ...

Ответы [ 3 ]

10 голосов
/ 31 мая 2011

Есть 3 разных случая для рассмотрения:

Значения действительно кодируются с использованием Latin1

Это последовательный случай: заявленная кодировка и совпадение кодировки контента. Это был единственный случай, который я рассмотрел в своем первоначальном ответе.

Используйте предложенную вами команду:

ALTER TABLE tablename CONVERT TO CHARSET utf8 COLLATE utf8_bin

Обратите внимание, что команда CONVERT TO CHARACTER SET появилась только в MySQL 4.1.2, поэтому любой, кто использовал базу данных, установленную до 2005 года, должен был использовать трюк экспорта / импорта. Вот почему в Интернете так много старых скриптов и документов, делающих это по-старому.

Значения уже закодированы с использованием utf8

В этом случае вы не хотите, чтобы mysql преобразовывал какие-либо данные, вам нужно только изменить метаданные столбца.

Для этого вам нужно сначала изменить тип на BLOB, а затем на TEXT utf8 для каждого столбца, чтобы не было преобразований значений:

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

Это рекомендуемый способ, и он явно задокументирован в Изменить синтаксическую документацию таблицы .

Значения используются в другой кодировке

Кодировка по умолчанию была Latin1 в течение нескольких лет в некоторых дистрибутивах Linux. В этом случае вы должны использовать комбинацию двух техник:

  • Исправьте метаданные таблицы, используя трюк типа BLOB
  • Преобразовать значения, используя CONVERT TO.
2 голосов
/ 31 мая 2011

В прошлом я делал это несколько раз на производственных базах данных (преобразование из старой стандартной кодировки шведский в latin1), и когда MySQL встречает символ, который не может быть преобразован в целевую кодировку, он прерывает преобразование и остается в неизменном состоянии. Поэтому я считаю, что оператор ALTER TABLE работает.

2 голосов
/ 31 мая 2011

Простое преобразование может привести к разрыву любых строк с символами, отличными от utf7.

Если у вас их нет (т. Е. Весь текст написан на английском языке), с вами обычно все будет в порядке.

Однако, если у вас есть какие-либо из них, вам необходимо преобразовать все поля char / varchar / text в blob на начальном этапе и преобразовать их в utf8 при следующем запуске.

См. Эту статью для подробных процедур:

http://codex.wordpress.org/Converting_Database_Character_Sets

...