Эмоджи в битрикс, конвертация базы из utf8mb3 в utf8mb4

Основное различие между utf8mb3 и utf8mb4 заключается в поддержке различных диапазонов символов и их кодировке.

  1. Диапазон символов:

    utf8mb3: Поддерживает только символы из базовой многоязычной плоскости (BMP, Basic Multilingual Plane), которая включает символы, закодированные в пределах 1-3 байт. Это охватывает большинство распространённых символов, включая латиницу, кириллицу, китайские иероглифы и другие.

utf8mb4: Поддерживает все символы из BMP, а также символы из дополнительных плоскостей (например, эмодзи, редкие иероглифы, символы древних письменностей). Эти символы могут занимать до 4 байт.

  1. Эмодзи и специальные символы:

    utf8mb3: Не поддерживает эмодзи и другие символы, которые требуют 4 байта для кодирования.

utf8mb4: Полностью поддерживает эмодзи и другие символы, требующие 4 байта.

  1. Совместимость:

    utf8mb3: Является устаревшей версией и считается ограниченной. В современных приложениях рекомендуется использовать utf8mb4.

utf8mb4: Является расширенной и современной версией, которая полностью совместима с utf8mb3 для символов, которые кодируются в 1-3 байта.

  1. Хранение данных:

    utf8mb3: Использует меньше места для хранения, так как не поддерживает 4-байтовые символы.

utf8mb4: Может занимать больше места для хранения, если используются 4-байтовые символы.

  1. Рекомендации:

    В современных приложениях рекомендуется использовать utf8mb4, так как он поддерживает больше символов и является более универсальным.

Если вам нужно хранить эмодзи или другие специальные символы, utf8mb4 — это единственный вариант.

Пример:

Если вы хотите хранить текст с эмодзи (например, 😊), то вам нужно использовать utf8mb4.

Если вы работаете только с текстом, который не содержит эмодзи или редких символов, utf8mb3 может быть достаточным, но всё равно рекомендуется использовать utf8mb4 для будущей совместимости.

Конвертация данных:

Зайдите в административную панель вашего сайта и перейдите в раздел Рабочий стол -> Настройки -> Инструменты -> Командная PHP-строка

Далее нужно выполнить PHP код, который подготовит SQL скрипт для конвертации базы в utf8mb4


$conn = \Bitrix\Main\Application::getConnection();

$helper = $conn->getSqlHelper();

$sql = "ALTER DATABASE `{$helper->forSql($conn->getDatabase())}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n";

$i = $conn->query('SHOW TABLES');

while ($row = $i->fetch()) {
    $table = reset($row);

    $sql .= "ALTER TABLE `{$helper->forSql($table)}` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n";
}

echo $sql;

на выходе мы получим готовый SQL скрипт, примерно такого содержания

ALTER TABLE `b_abtest` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_admin_notify` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_admin_notify_lang` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_banner` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_banner_2_country` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_banner_2_day` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_banner_2_group` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_banner_2_page` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_banner_2_site` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_banner_2_stat_adv` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_banner_2_weekday` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_contract` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_contract_2_page` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_contract_2_site` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_contract_2_type` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_contract_2_user` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_contract_2_weekday` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_adv_type` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_agent` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_app_password` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_b24connector_button_site` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `b_b24connector_buttons` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Затем перейти Рабочий стол -> Настройки -> Инструменты -> SQL запрос
и выполнить полученный скрипт.

После конвертации нужно изменить настройки подключения к базе, в файле /bitrix/php_interface/after_connect_d7.php для SET NAMES и SET collation_connection

$this->queryExecute("SET NAMES 'utf8mb4'");
$this->queryExecute('SET collation_connection = "utf8mb4_unicode_ci"');

Обратите внимание:

Что для конвертации таблиц используется ALTER TABLE ... CONVERT TO CHARACTER SET ..., который в качестве стороннего эффекта увеличивает допустимую размерность некоторых символьных полей. Проверка сайта покажет несоответствие структуры базы данных и определений таблиц, как они заданы в модулях. Это несоответствие не является критическим для работы сайта и может быть исправлено выполнением ALTER TABLE ... CHANGE COLUMN, полученными из журнала проверки сайта.

Заключение:

utf8mb4 — это более современная и расширенная версия, которая рекомендуется для использования в большинстве случаев. utf8mb3 считается устаревшим и ограниченным.