Перевод кодировки с latin1 в UTF-8 в MySQL
При переводе сайта с одного хостинга на другой (ну или при обновлении MySQL) может возникнуть некоторые проблемки с кодировкой. Тоесть вместо всеми любимой кирилицы мы видим одни ????? (вопросительные знаки).
Предлагаю мое решение по устранению этого казуса.
Не забываем о том, что все ниже перечисленные операции производятся от имени суперпользователя (root).
DBNAME — имя вашей базы.
Создание дампа базы
Естественно, мы создадим копию оригинальной базы, а как же иначе.
mysqldump -u root -p --opt --default-character-set=latin1 --skip-set-charset DBNAME > DBNAME.sql
Удаление и создание
Теперь, потирая руки (можно добавить немного дьявольского смешка) и с криками «шеф, все пропало!!!», удаляем старую базу и создаем новую с поддержкой UTF-8 кодировки.
mysql -u root -p --execute="DROP DATABASE DBNAME;CREATE DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;"
Востановление дампа базы
Теперь важный шаг в вашей жизни — это востановить потертые данные из дампа преобразуя в новую, нужную нам кодировку. Иначе прийдется кричать «БАНЗАЙ!!!», снимать тапки и делать харакири.
mysql -u root --max_allowed_packet=16M -p --default-character-set=utf8 DBNAME < DBNAME.sql
Опция max_allowed_packet - иногда очень важна, а вдруг вы импортируете базу большого размера? В общем если вы при импорте получите ошибку аля "1153 в строке 42: Полученный пакет больше, чем 'max_allowed_packet'" то вам необходимо увеличить размер пакета (это увеличение будет действовать до первого перезапуска демона MySQL).
Для того чтобы не включать постоянно эту опцию можно подкоректировать /etc/my.cnf (или добавить если такая опция отсутствует)
[mysqld] max_allowed_packet=16M
Вот и все. Просто, быстро и со вкусом.