====== Полный переход на 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';
===== Перевод базы =====
* [[#tab-file|Через восстановление бекапа (Для больших баз)]]
* [[#tab-command|Через консольную команду (Для маленьких баз)]]
=== Перевод базы методом замены кодировки в файле бекапа ===
- Консоль в которой это будете делать должна поддерживать utf8, если не поддерживает (не отображаются кириллица) то найдите в google как это сделать
- Сделайте бекап бекапа, на случай если что то пойдет не так, то вы не испортите оригинал бекапа.
- Отключите nginx что бы не было ошибок для абонентов, сотрудников и платежных систем.
\\ Далее нужно выполнить команду на смену кодировок в файле бекапа
\\ Все предварительные переводы с разных кодировок в koi8r нужны что бы привести все к общему виду.
\\ Данная команда сделает следующее:
- Переведет utf8mb4 кодировки в koi8r
- Переведет utf8mb3 кодировки в koi8r
- Переведет utf8 кодировки в koi8r
- Переведет koi8u кодировки в koi8r
- Переведет koi8r кодировки в utf8mb4
В примерах команд используется название бекапа **database_backup.sql** и он располагается **в той же директории где запускаются команды**)
Если mysql не поддерживает **utf8mb4**, то в конце при переводе с koi8r на utf8mb4 (**s/koi8r/utf8mb4/g**) нужно указать просто **utf8** без mb4
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) что бы во время перехода абоненты и сотрудники не сталкивались с ошибками.
\\ Далее нужно перейти в директорию админки и запустить консольную команду биллинга на смену кодировки
Рекомендуем запускать консольную команду в **screen** так как этот процесс может занять **много времени** (зависит от размера базы)
Если mysql не поддерживает **utf8mb4**, то запускать нужно указав просто **utf8**
cd /var/www/mikbill/admin
php index.php sql_convert utf8mb4
В процессе работы модуль будет записывать свою работу в дебаг лог.
===== После перевода =====
В файлы конфига в раздел **** нужно добавить параметр **utf8mb4**, пример:
Если mysql не поддерживает **utf8mb4**, то нужно указать просто **utf8**
db.localhost
root
mikbill
utf8mb4
Europe/Kiev
false
...
Данный параметр нужно добавлять в конфиг админки, ЛК и ЛК API (если установлено)
После добавления параметра, включите nginx и у вас все должно работать на новой кодировке.