[Вне]Очередной перезд на новый сервер

Таки удалось уговорить админа перенести блог на другой сервер с установленным MySQL 4.1. Теперь проблемы с русским исчерпаны - блог работает в UTF-8. Однако пришлось повозиться.

Первый шаг - перенос базы. Так как предыдущая установка работала в кодировке Cp866, требовалась конвертирование базы в новую кодировку. Тут все просто:

sh>mysqldump -uusername -ppassword dbname | iconv -f cp866 -t utf8 > wp.sql

Далее немного сложнее. MySQL на сервере работает по умолчанию в кодировке latin1. Я же создаю базу данных с кодировкой по умолчанию UTF-8

create database dbname character set utf8 collate utf8_general_ci;

Теперь импортирую данные в базу.

mysql -S/path/to/socket --default-character-set=utf8 -uusername -ppassword dbname

Обратите внимание на опцию default-character-set. Она указывает клиенту mysql на то, что работать он должен с сервером в кодировке utf8. Если этого не сделать, то клиент mysql будет использовать ту кодировку, которая установлена по умолчанию для сервера (в моем случае это latin1), и в результате в таблицах БД могут появиться битые данные (у меня, например, вместо некоторых русских символов в тексте появились знаки вопроса).

И так, запускаю команду и… И что я вижу:

mysql: Character set 'utf8' is not a compiled character set and is not specified in the '/usr/share/mysql/charsets/Index' file

Проверяю

sh>mysql --version

и понимаю, что клиент у меня версии 3.23.xx, который, действительно, про utf8 знать ничего не знает. Что делать? А все очень просто. Открываю дамп-файл wp.sql, и в самом начале прописываю

SET NAMES utf8;

Вероятно, это та самая команда, которую выполняет mysql клиент, будучи запущенным с опцией default-character-set. Однако она не требует наличия поддержки этой кодировки у клиента. Запускаю импорт еще раз, но уже без указания кодироки:

mysql -S/path/to/socket -uusername -ppassword dbname

На этот раз все проходит гладко, и у меня есть импортированная БД.

Распаковываю последнюю версию WordPress, открываю сайт в браузере и… вижу кракозябры. После некоторых раздумий и блужданий по поисковым серверам понимаю, что WordPress, как и клиент mysql, по умолчанию пытается работать с сервером mysql в его кодировке latin1, а не в той, в которой мне нужно. Исправить ситуацию оказалось совсем не сложно. Достаточно открыть файл wp-includes/wp-db.php и в функции wpdb после создания нового соединения выполнить ту же команду SET NAMES utf8;. Окончание функции wpdb у меня выглядит так

$this->select($dbname); $this->query("SET NAMES utf8"); }

Сохраняю и опять открываю сайт в браузере. На этот раз все отлично, и у меня перед глазами все то же что и было раньше, только теперь блог работает в UTF-8 и у меня наконец работает поиск.

 

One reply


  1. хех! повозиться и правда пришлось! =))

Leave a reply