Используем оффициальную документацию: dev.1c-bitrix.ru/learning/course...
От себя добавлю несколько дополнительных моментов.
Перед шагом 1 сделаем необходимые бэкапы. Убедимся, что на сайте никого нет и сделаем вручную с экспертными настройками, но без бэкапов и хранилища, чтобы сэкономить место. Бэкапы с хранилищем у нас ведь есть в регулярных бэкапах? :)
tar --exclude="upload" --exclude="bitrix/backup" -czvf bitrix.YOURNAME.com.tar.gz bitrix.YOURNAME.com
Также перед перекодировкой файлов хорошо бы иметь бэкап файлов отдельно. Поднимемся в папку /home/bitrix и сделаем:
cd /home/bitrix
tar --exclude="upload" --exclude="bitrix/backup" -czvf bitrix.YOURNAME.com.tar.gz www
где www - файлы сайта битрикс.
Но это ещё не все конфигурационные файлы, где может быть прописана кодировка. У нас оказалось ещё прописано local value, как указано на странице phpinfo:
Я нашёл, что в этих файлах:
/etc/httpd/bx/conf/bx_ext_bitrix.YOURNAME.com.conf
/etc/httpd/bx/conf/default.conf
был прописан параметр:
php_admin_value default_charset cp1251
Пришлось закомментировать эту строку и вежливо попросить апач перечитать конфиг:
apachectl graceful
(смотрите ссылку на руководство в начале)
Чтобы сконвертировать базу мы получаем список запросов, как указано в руководстве. Для удобства, сгенерированный список запросов можно сохранить в файл и положить в папке, откуда мы запустили на сервере в терминале mysql -u ...
и затем выполнить запросы из файла:
source bitrix_new_utf8_convert.sql;
Например, в файле "bitrix/php_interface/after_connect_d7.php" нужно поменять код на такой:
<?
$this->queryExecute("SET NAMES 'utf8'");
$this->queryExecute('SET collation_connection = "utf8_unicode_ci"');
?>
Скрипт, который предлагатся в руководстве не самый оптимальный. Мы его улучшим. У себя я обнаружил, что кроме русского языка в кодировке cp1251 есть и другие языки, но они были добавлены позже и все они в utf-8. Также английский язык в кодировке по-умолчанию iso...
Вот команда, которая найдёт все файлы, исключая те, которые являются utf-8, выведет по очереди на экран и сконвертирует, оставив копию каждого файла, добавив к нему .icv
find ./ -name "*.php" -type f |
while read file
do
if ! file -bi $file | grep -q 'utf-8'
then
echo " $file"
mv "$file" "$file".icv
iconv -f WINDOWS-1251 -t UTF-8 "$file".icv > "$file"
fi
done
Файликов .icv станет немало, десятки тысяч. Их можно посчитать командой:
cd /home/birix/www
find ./ -name "*.php.icv" -type f | wc
Позже, если всё в порядке, эти копии можно будет удалить такой командой:
cd /home/birix/www
find ./ -type f -name '*.php.icv' -delete
Если всё же использовать xargs, лучше так:
cd /home/birix/www
find ./ -type f -name '*.php.icv' -print0 | xargs -0 rm
Чтобы их исправить, можно просто выполнить предлагаемые запросы через консоль.
Однако, 2 запроса у меня не сработали:
ALTER TABLE `bitrix_88`.`b_search_stem` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE `bitrix_88`.`b_search_tags` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Обнаружил, что может потребоваться вручную в БД исправить некоторые таблицы, так как у них "COLLATE cp1251_bin":
Нашёл такое решение: пересоздать такие таблицы. То есть сделать чистые копии, перекодировать и удалить старые:
CREATE TABLE b_search_stem_new LIKE b_search_stem;
ALTER TABLE b_search_stem_new CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
INSERT INTO b_search_stem_new SELECT * FROM b_search_stem ON DUPLICATE KEY UPDATE STEM = VALUES(STEM);
ALTER TABLE b_search_stem RENAME b_search_stem_old;
ALTER TABLE b_search_stem_new RENAME b_search_stem;
// потом, можно удалить табличку _old:
DROP TABLE b_search_stem_old;
CREATE TABLE b_search_tags_new LIKE b_search_tags;
ALTER TABLE b_search_tags_new CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
INSERT INTO b_search_tags_new SELECT * FROM b_search_tags ON DUPLICATE KEY UPDATE NAME = VALUES(NAME);
ALTER TABLE b_search_tags RENAME b_search_tags_old;
ALTER TABLE b_search_tags_new RENAME b_search_tags;
// потом, можно удалить табличку _old:
DROP TABLE b_search_tags_old;
(Данные, которые в них в принципе не особо нужны. Но при желании можно сделать дамп).