Как мы чинили volgograd.lug.ru
при ремонте wackowiki версии 3.5 которая прослужила нам больше 5 лет.
обнаружилась небольшая проблема с mysql который все это время не стоял на месте, а развивался и научился работать с кодировками.
итак.было mysql 4.0
стало mysql 5.0.51
данные в базе находились в кодировке cp1251
с charset в базе данных и в таблицах был полный бардак (видимо потому, что при создании этой базы данных и этих таблиц mysql еще мало знал о кодировках, а потом mysql похоже еще и апгрейдили на хостинге, и он
какие-то там свои умолчания менял, и иногда это похоже отражалось и на базе, хорошо хоть что не на данных).
в итоге на момент разборок имелась база данных с прописанными collate и charsets в
koi8-r, cp1251
новая система с локалью utf8 на которой все нужно было развернуть
к старой системе доступа не было.
была куча бакупов от mysqldump но практически бесполезных, так как при этих бакупах побилась кодировка и важные «системные» символы (вокруг которых завязана wackowiki) оказались утерянны.
хорошо что удалось раздобыть копию старой базы со старого хостинга (файлы что лежат в /var/lib/mysql/db/имя_базы)
никакие пляски со сменой кодировки средствами mysql, ALTER TABLE и тп не помогли, вместе со сменой charset и collation mysql менял и данные в таблице перекодировал их в кракозяблы и соответственно убивал «волшебные символы» так их рас так.
после долгих копаний, чтения
всякого-превсякого, получилось сделать таким образом:
# получаем структуру таблиц
mysqdump --no-data имя_бд > db.sql
при использовании --
default-character-set=latin1
как советуется тут:
http://www.linux.by/wiki/index.php/FAQ_PHP_MySQL_charset
данные у меня превращались в вопросики
#правим кодировки создания таблиц в файле db.sql
vim db.sql (мне нужно было сделать всё в cp1251)
#создаем новую базу данных с правильной кодировкой
mysql
>charset cp1251;
>create database new_db;
#создаем структуру таблиц в новой базе из нашего файла db.sql
mysql new_db < db.sql
#получаем пустую базу с правильными кодировками.
#выключаем mysql и копируем в нее «правильные» файлы с данными
service mysqld stop
cd old_db
for i in *.MYD; do cp -af $i ../new_db/ ; done
# и, самое главное, пересоздаем индексы и чиним базу new_db::
cd new_db
myisamchk -o *.MYI
# теперь можно запустить mysqld и проверить получилось ли чудо
service mysqld start
PS
cp1251_bin бинарная сортировка (по ASCII кодам)
cp1251_general_ci без учета регистра
cp1251_general_cs с учетом регистра
полезные ссылки:
http://www.linux.by/wiki/index.php/FAQ_PHP_MySQL_charset
http://dev.mysql.com/doc/refman/5.1/en/charset.html
http://dev.mysql.com/doc/refman/5.1/en/charset-connection.html
http://dev.mysql.com/doc/refman/5.1/en/charset-configuration.html
http://dev.mysql.com/doc/refman/5.1/en/repair.html
http://dev.mysql.com/doc/refman/5.1/en/charset-conversion.html