Sep 11, 2012 15:08
Дано: база данных, с которой сделали дамп. Дамп закачали на другой сервер. На выходе имеем русский текст с битыми буквами "ш" и "И".
Причина: данные в кодировке cp1251 хранятся в виде utf-8, в результате неправильных настроек скриптов. В процессе экспорта-импорта некоторые буквы бьются.
Как исправить:
1) дампим таблицу
> mysqldump database table > table.sql
2) конвертируем данные из utf-8 в cp1251, получаем на выходе дамп в более-менее нормальной utf8 с битыми буквами "ш" и "И":
> iconv -t cp1251 -f utf-8 table.sql > table.sql.fix
3) меняем битые ш и И на их корректные utf8 версии:
> perl -pi -e "s|\xD0\x3F|\xD0\x98|g" table.sql.fix
> perl -pi -e "s|\xD1\x3F|\xD1\x88|g" table.sql.fix
4) меняем в структуре таблицы utf8 на cp1251:
> cat table.sql.fix | sed 's/utf8/cp1251/g' > table.sql
5) заливаем полученый файл в базу:
> mysql database table < table.sql
6) возможно в скриптах нужно будет поменять SET NAMES cp1251 на utf8. Или наоборот.
Если таблиц много, то процесс можно автоматизировать. Например, попалась база, где таблицы форума были нормальные, а остальные таблицы, от копермайна, хранились в кривой кодировке.
1) создаем временную директорию, заходим в нее. дампим все таблицы, кроме phpbb:
mysql -S database -e "show tables" | egrep -v "Tables|phpbb" | xargs -n 1 -I {} echo 'mysqldump database {} > {}.sql' | sh
2) find . -type f | xargs -n 1 -I {} echo 'iconv -t cp1251 -f utf-8 {} > {}2' | sh
удаляем старые дампы:
rm *.sql;
3) find . -type f | xargs -n 1 -I {} echo 'perl -pi -e "s|\xD0\x3F|\xD0\x98|g" {}' | sh
find . -type f | xargs -n 1 -I {} echo 'perl -pi -e "s|\xD1\x3F|\xD1\x88|g" {}' | sh
4) find . -type f | xargs -n 1 -I {} echo 'cat {} | sed 's/utf8/cp1251/g' > {}3' | sh
удаляем старые дампы:
rm *.sql; rm *.sql2
5) find . -type f | xargs -n 1 -I {} echo 'mysql database < {}' | sh
быдни сисадмина,
хозяйке на заметку,
красноглазие