billing:howto:sql_convert

Полный переход на utf8 (utf8mb4)

С версии 3.13.07 доступен переход с режима работы в koi8r/koi8u на utf8/utf8mb4

  1. Уметь откатывать версию биллинга
  2. Уметь восстанавливать базу из бекапа
  3. Сделать бекап базы
  4. Узнать какая версия mysql установлена и поддерживает ли она кодировку utf8mb4
  5. Должна быть установлена версия биллинга не ниже 3.13.07 (админка, ЛК, ЛК API и другие компоненты)

Если во время перевода базы возникает ошибка Index column size too large. The maximum column size is X bytes то нужно выполнить команду в MySQL:

SET GLOBAL innodb_default_row_format = 'DYNAMIC';

Перевод базы методом замены кодировки в файле бекапа

  1. Консоль в которой это будете делать должна поддерживать utf8, если не поддерживает (не отображаются кириллица) то найдите в google как это сделать
  2. Сделайте бекап бекапа, на случай если что то пойдет не так, то вы не испортите оригинал бекапа.
  3. Отключите nginx что бы не было ошибок для абонентов, сотрудников и платежных систем.


Далее нужно выполнить команду на смену кодировок в файле бекапа
Все предварительные переводы с разных кодировок в koi8r нужны что бы привести все к общему виду.
Данная команда сделает следующее:

  1. Переведет utf8mb4 кодировки в koi8r
  2. Переведет utf8mb3 кодировки в koi8r
  3. Переведет utf8 кодировки в koi8r
  4. Переведет koi8u кодировки в koi8r
  5. Переведет 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 и у вас все должно работать на новой кодировке.

  • billing/howto/sql_convert.txt
  • Последнее изменение: 9 мес. назад
  • alexd