Эта полная драматизма история произошла тогда, когда наш старый хостер решил переместить наш сайт на новый сервер. Предупреждение было получено, и мы, в общем-то и не волновались особо, когда не имели возможности получить доступ к сайту. Работы – значит работы.

Но подходил срок окончания оплаченного времени хостинга. И вставал острый вопрос: оставаться или уходить. Свистопляска последних недель с uptime заставляла серьёзно задуматься. Было принято решение сменить провайдера. В качестве альтернативы выбрали Site5.com (нам по ряду причин необходим именно зарубежный хостинг).

Самое интересное началось при переносе баз данных. Обычный экспорт посредством phpMyAdmin давал sql-файл в загадочной кодировке, который будучи импортирован под MySQL выдавал ошибки и, кроме того, при более-менее удачном импорте пропадали некоторые русские буквы. Было написано около 20 писем в саппорт старого и нового хостинга в попытках добиться нормального переноса базы, перекачано около ста мегабайт данных (учтите, что у меня диалап и не самый лучший). Всё это осложнялось тем, что зарубежный саппорт не совсем понимал проблему, ибо им было сложно оценить кодировку, не имея установленных русских шрифтов и не зная русского языка. Не буду вас угнетать описанием всего того, что происходило всю прошлую неделю, честно говоря, самому вспоминать не особо хочется, поделюсь лишь своим рецептом решения проблемы.

Сразу оговорюсь, что я не веб-мастер и не веб-программист. Многие вещи пришлось изучить уже в процессе решения проблемы и есть вероятность, что я что-то понял не так, знающие люди пусть меня поправят.

Итак, приступим.

Причина проблемы:
На старом хостинге до переноса стояла старая версия MySQL. Наши базы данных имели collation=latin, но реально в них хранились данные в utf8. Соответственно, при экспорте всё немыслимо переворачивалось и часть символов воспринималось как служебные, что и послужило причиной пропадания некоторых букв. Всё это осложнялось тем, что на новом сервере, как выяснилось, база уже была испорчена при переносе.

Моё решение проблемы:
Удалось уговорить саппорт дать мне бэкап внутренних файлов MySQL, сделанный перед переездом на новый сервер (это *.MYI, *.MYD, и *.frm файлы). Затем я поместил их локально у себя под Денвер. Там была старая версия MySQL и потому, оно работало так же, как и на старом хостинге до переезда. Затем я сделал экспорт в sql файл, который тоже был выполнен правильно – кодировка сохранилась. В этом файле после каждого CREATE TABLE после ENGINE=MyISAM я добавил строки DEFAULT CHARSET=utf8 (там вообще ничего не было указано). Далее у нового хостера я создал базу данных, указал ей collation=utf-general-ci и произвёл импорт. Результат меня несколько обескуражил – весь текст на сайте превратился в знаки вопроса.

Обращение ко всемирному разуму подсказало следующий выход. В каталоге wp-include в файле wp-db.php в самом конце после строк


$wpdb = new wpdb(DB_USER, DB_PASSWORD, DB_NAME, DB_HOST);


я добавил


if(substr(mysql_get_server_info(), 0, 3) == "4.1") {
  $wpdb->query('SET NAMES  utf8');
}


Результат вы видите сами. Кстати, теперь экспорт нашей базе не страшен – на сервере она лежит в правильном формате со всеми правильными атрибутами.