Volgograd

Волгоград Linux User Group

Организована 23 ноября 2002 года

Вход:  Пароль:  

TarasAblamsky/MySQLcharsets


Как мы чинили 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