Мар
10
2011

Жесткий секс с кодировкой бд

Жесткий секс с кодировкой бд

Несколько дней подряд я занимался «жёстким сексом» с упёртой базой данных. Под катом история о перекодировке бд, проблемы и попытки решить их.

Все началось с того, что недавно мне нужно было продлить один старый домен на котором висел небольшой сайтец, который мирно приносил не большую прибыль и сам себя обеспечивал с сапе. Сайт работал на движке WordPress старой сборки от Макса. Если кто помнит там был один прикол. Блог мог работать в кодировке UTF-8, а база данных могла быть в кодировке WINDOWS-1251. И все это дело как-то так работало. В 2008 я что-то там начудил и пропала буква «ш». В phpmyadmin при попытке посмотреть данные в поле базы данных отображались одни крякозябры. Решил, что теперь пока не решу проблему не отступлю!

Перекодировка базы данных Doubly-encoded to UTF-8 from CP1251

Сделать бекап бд можно как минимум 3 способами: непосредственно в phpmyadmin, с помощью плагина WordPress (например, WordPress Database Backup), с помощью Sypex Dumper. Пробовал все три варианта так как думал по-началу, что сам туплю при бекапе.
Потом я узнал о замечательных утилитах для Ubuntu: enca, enconv, iconv, recode.
Поюзал программы: Штирлиц и TextPipe Pro (кстати кому надо могу выложить на хостинг). Больше всего напрягало, что онлайн перекодировщики спокойно перекодировали куски текста, указывая направление UTF-8 -> cp1251.
А теперь все по порядку.
Код:

enca имя_файла бд

выдал:

Universal transformation format 8 bits; UTF-8
Doubly-encoded to UTF-8 from CP1251

Кстати, забыл сказать. База не открывалась ни в одном редакторе правильно. Тоже одни крякозябры. Как только я ее не пробовал открывать.
Так вот по этой фигне с двойной кодировкой UTF-8 ничего толкового не нашёл. Начал активно замахивать форумчах на нескольких тематичных форумах. Вот оттуда и узнал о стольких утилитах и о том, что аналога Штирлица под Линукс нет в графическом виде, только утилиты. Хочу сказать, что Штирлиц не справился с базой в 20мб. Он тупо вис и в виндовсе и Wine с под Линукса. С TextPipe у меня тоже не срослось. Там нужно было подбирать фильтры. В общем вникать не захотелось. По идее мне должна была помочь одна с этих команд:

iconv -f utf8 -t cp1251 oldfile.sql > newfile.sql

Новый файл создавался, но текст оставался по-прежнему не читаемым.

enconv -x CP1251 file.txt

Тоже самое, что и с кодом выше.

recode UTF8..CP1251 file.txt

И это не помогло.

gedit --encoding windows-1251 file.txt

gedit просто вешался при попытке открыть так базу.

Извращённое решение проблемы перекодировки.

Не думаю, что этот вариант перекодировки самый оптимальный, но лучше, чем создавать массив сравнения или колдовать с помощью других языков программирования. В общем нашёл такой простой код на php.

echo iconv("utf-8", "windows-1251", "Пора переходить на cp-1251.");

Подумал, а чем черт не шутит 🙂 и пихнул вместо «Пора переходить на cp-1251.» всю битую бд! Сохранил php файл и кинул его на локальный сервер в папку домена. При первой попытке открыть файл, браузер подзавис (ну еще бы база на 20метров). Отобразилось несколько строк перекодированных и процесс остановился. Пришлось править код базы и заменять конфликтные участки кода. Очень помог в этом деле Geany в котором сразу можно было отследить конфликтные символы. Через час примерно все отобразилось. Зашёл в браузере в исходный код страницы и все скопировал в новый документ в кодировке utf-8. Пришлось много чего править так как буква «ш» и «Р» потерялись и вместо них отображались знаки вопроса в ромбике. Также буква «И» в нескольких словах пропала. После правки залил бд на хосинг с помощью phpmyadmin (благо хостер позволяет заливать файлы до 50метров).
Теперь вот сижу и нарадоваться не могу! Какой же Сережка молодец! 🙂

А вот и видео по теме нашёл.
//youtu.be/RirqnBUQTEU



Метки: , , , ,


Читайте, не отвлекайтесь! =)

© Интернет дом ленивца - личный блог о сео, смо, сайтостроению. Построен на небольших заметках автора. Копирование материалов без активной ссылки на darmoid.ru запрещается и преследуется законом об авторском праве!
Вверх!