Эмоджи в битрикс, конвертация базы из 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
$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 считается устаревшим и ограниченным.