Исправление битой кириллицы после экспорта/импорта mysql

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

быдни сисадмина, хозяйке на заметку, красноглазие

Previous post Next post
Up