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

3 мин26.01.2025

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

  • Диапазон символов. utf8mb3 поддерживает только базовую многоязычную плоскость (BMP, Basic Multilingual Plane) — символы в пределах 1–3 байт: латиницу, кириллицу, китайские иероглифы и другие распространённые. utf8mb4 добавляет дополнительные плоскости: эмодзи, редкие иероглифы, символы древних письменностей. Такие символы занимают до 4 байт.
  • Эмодзи и специальные символы. utf8mb3 не поддерживает их вовсе — им нужно 4 байта на символ. utf8mb4 поддерживает полностью.
  • Совместимость. utf8mb3 — устаревшая и ограниченная версия. utf8mb4 полностью совместима с ней для символов, которые кодируются в 1–3 байта.
  • Хранение данных. utf8mb3 занимает меньше места, потому что не хранит четырёхбайтовые символы. utf8mb4 может занимать больше — но только если такие символы в данных есть.
  • Что выбирать. В современных приложениях — utf8mb4: он универсальнее. Для эмодзи и редких символов это вообще единственный вариант.

Как проявляется

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

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

Конвертируем базу

Порядок конвертации

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

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

php

$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 скрипт, примерно такого содержания

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

php
$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 считается устаревшим и ограниченным.

← Все статьи