Convert MySQL encoding
From Help system
Ситуация: у нас есть сервер, на котором стоит mysql 4.1 +, и все базы в latin1
Требуется перекодировать все базы в cp1251 или utf8
Прежде всего надо сделать обновление до 5 версии mysql. Это не обязательно, но очень желательно. Тестирование выполнения данного howto производилось именно на 5 версии.
Итак, в целом шаги следующие:
- Остановка apache + mysql и выполнение полного бэкапа
cp -r /var/lib/mysql /var/lib/mysql.orig
- Запуск mysql и выполнение дампа следующим образом:
mysqldump --skip-set-charset --default-character-set=latin1 --compatible=mysql40 --skip-opt --skip-comments --all-databases > /root/backup.sql
- На данный момент у нас уже должен быть дамп в читаемой русской кодировке, но в нем будут присутсвовать сообщения о latin1, и если мы его востановим прямо сейчас то получим тоже что и было, если не хуже. Поэтому убираем все упоминания о latin1 как о страшном сне.
sed 's/DEFAULT CHARACTER SET latin1/ /' /root/backup.sql > /root/backup.sql.new
- Отлично. Теперь удаляем все базы кроме mysql и information_scheme. Если это делать через phpmyadmin, то он не даст их удалить в любом случае.
- Теперь редактируем /etc/my.cnf и добавляем туда:
[mysqld] collation-server=cp1251_general_ci default-character-set=cp1251 init-connect='SET NAMES cp1251' [client] default-character-set=cp1251
- Рестартим mysql и загружаем в него наш дамп.
mysql --force < /root/backup.sql.new
- Проверяем. Все базы должны быть в cp1251 и в читаемом виде.
Если нет - значит или что-то не так сделали, или изначально базы были в другой кодировке и требуется более тщательный анализ и работа.
На этот случай у нас есть бэкап.
rm -rf /var/lib/mysql mv /var/lib/mysql.orig /var/lib/mysqlи удаление/комментирование строк про collation в /etc/my.cnf
P.S. Апач уже можно включать
