Полный переход на utf8 (utf8mb4)
С версии 3.13.07 доступен переход с режима работы в koi8r/koi8u на utf8/utf8mb4
Подготовка к переходу
- Уметь откатывать версию биллинга
- Уметь восстанавливать базу из бекапа
- Сделать бекап базы
- Узнать какая версия mysql установлена и поддерживает ли она кодировку utf8mb4
- Должна быть установлена версия биллинга не ниже 3.13.07 (админка, ЛК, ЛК API и другие компоненты)
Возможные проблемы
Если во время перевода базы возникает ошибка Index column size too large. The maximum column size is X bytes то нужно выполнить команду в MySQL:
SET GLOBAL innodb_default_row_format = 'DYNAMIC';
Перевод базы
Перевод базы методом замены кодировки в файле бекапа
- Консоль в которой это будете делать должна поддерживать utf8, если не поддерживает (не отображаются кириллица) то найдите в google как это сделать
- Сделайте бекап бекапа, на случай если что то пойдет не так, то вы не испортите оригинал бекапа.
- Отключите nginx что бы не было ошибок для абонентов, сотрудников и платежных систем.
Далее нужно выполнить команду на смену кодировок в файле бекапа
Все предварительные переводы с разных кодировок в koi8r нужны что бы привести все к общему виду.
Данная команда сделает следующее:
- Переведет utf8mb4 кодировки в koi8r
- Переведет utf8mb3 кодировки в koi8r
- Переведет utf8 кодировки в koi8r
- Переведет koi8u кодировки в koi8r
- Переведет koi8r кодировки в utf8mb4
sed -i -e 's/_0900_ai_/_general_/g' -e 's/_unicode_/_general_/g' -e 's/utf8mb4/koi8r/g' -e 's/utf8mb3/koi8r/g' -e 's/utf8/koi8r/g' -e 's/koi8u/koi8r/g' -e 's/koi8r/utf8mb4/g' database_backup.sql
Далее если вы использовали буквы украинского алфавита: і І ї Ї є Є ґ Ґ
То нужно запустить еще команду для замены символов на буквы
sed -i -e 's/╕/і/g' -e 's/╤/І/g' -e 's/╖/ї/g' -e 's/╥/Ї/g' -e 's/╓/є/g' -e 's/╢/Є/g' -e 's/╜/ґ/g' -e 's/╫/Ґ/g' database_backup.sql
Перед восстановлением измените кодировку подключения к базе на utf8mb4 или utf8, иначе можете нарваться на ошибку Illegal mix of collations for operation 'UNION'
SET NAMES utf8mb4; SET CHARSET utf8mb4; SET sql_mode = '';
Далее восстановите базу из этого бекапа (можно в другую базу и просто переключиться на неё в конфиге)
Новую базу нужно создавать уже в новой кодировке (utf8mb4_general_ci или utf8_general_ci)
CREATE DATABASE mikbill CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Так же не забывайте про процедуры базы.
Перевод базы запуском консольной команды
Нужно остановить web сервер (nginx) что бы во время перехода абоненты и сотрудники не сталкивались с ошибками.
Далее нужно перейти в директорию админки и запустить консольную команду биллинга на смену кодировки
cd /var/www/mikbill/admin php index.php sql_convert utf8mb4
В процессе работы модуль будет записывать свою работу в дебаг лог.
После перевода
В файлы конфига в раздел <mysql> нужно добавить параметр <charset>utf8mb4</charset>, пример:
<config> <parameters> <mysql> <host>db.localhost</host> <username>root</username> <password></password> <dbname>mikbill</dbname> <charset>utf8mb4</charset> </mysql> <timezone>Europe/Kiev</timezone> <partialUTF8>false</partialUTF8> ... </parameters> </config>
Данный параметр нужно добавлять в конфиг админки, ЛК и ЛК API (если установлено)
После добавления параметра, включите nginx и у вас все должно работать на новой кодировке.