Ars Longa, Vita Brevis

Быстрый способ преобразования charset базы данных MySQL

Недавно мне пришлось столкнуться с задачей перевода базы данных из одного charset в другой. Исходная база была в iso-8859-1, предстояло перевести её в utf-8. Задача усложнялась тем, что в исходной базе присутствовали символы из других языков (русский, испанский и, возможно, китайский).

Погуляв по Интернету и поискав в Google, я нашёл несколько решений.

  1. Способ, который мне очень понравился — TIP: Convert latin1 to UTF-8 in MySQL
    Вкратце (я немного изменил команды для повышения эффективности работы скрипта):
    [-]
    View Code Bash
    mysqldump -uuser -ppassword --default-character-set=latin1 -n -K --skip-set-charset --skip-create-options --skip-extended-insert --compatible=mysql40 --max_allowed_packet=64K dbname > latin_dump.sql
    iconv -f ISO-8859-1 -t UTF-8 latin_dump.sql > utf8_dump.sql
    mysql --max_allowed_packet=1M -uuser -ppassword --default-character-set=utf8 database_utf8 < utf8_dump.sql
    rm -f *.sql

    Идея состоит в том, что мы просто создаём дамп исходной базы, при этом указывая mysqldump, что никаких деклараций CHARSET и иже с ними указывать не надо, затем скармливаем полученный дамп iconv, который преобразует весь latin1 в utf8, а затем преобразованный файл отдаём mysql (при этом указываем, что charset по умолчанию у нас utf8).
    Из неприятного: не сработало :-) Как оказалось, из-за того, что cPanel создал базу (которая database_utf8) с DEFAULT CHARSET latin1. К счастью, лечится просто:

    [-]
    View Code MySQL
    ALTER DATABASE `database_utf8` CHARACTER SET 'utf8';
    ALTER DATABASE `database_utf8` COLLATE 'utf8_general_ci';
  2. Экзотика (ссылку, к сожалению, потерял): идея состоит в том, что каждый столбец (CHAR, VARCHAR, TEXT etc) преобразуется сначала в BLOB (при этом меняется только тип �