Включить поддержку emoji для сайта на Битрикс

Если вы пытаетесь сохранить сообщение с emoji в CRM Битрикс24 или на сайте «1С-Битрикс», но видите вместо смайликов знаки вопроса или пустые квадраты — причина почти всегда одна: база данных MySQL использует кодировку utf8 вместо utf8mb4. В этой статье разберём, как включить поддержку emoji в Битрикс, последовательно выполнив конвертацию базы данных.

Почему emoji не сохраняются в Битрикс

Стандартная кодировка utf8 в MySQL — это не полноценный UTF-8. Она поддерживает только символы, которые занимают до 3 байт, тогда как большинство emoji требуют 4 байта (так называемые символы из дополнительных плоскостей Unicode). Когда вы вставляете emoji в текстовое поле, MySQL просто отрезает строку на месте четырёхбайтового символа или заменяет его знаком вопроса.

Решение — конвертировать базу данных и её таблицы в кодировку utf8mb4 («mb4» означает «multi-byte, 4 bytes»). Именно она соответствует настоящему UTF-8 и поддерживает весь диапазон Unicode, включая emoji.

Шаг 1: Резервная копия базы данных

Перед любыми изменениями в базе данных обязательно сделайте резервную копию. Это займёт несколько минут, но сохранит вам часы работы в случае ошибки.

mysqldump -u root -p название_базы > /home/backup_before_utf8mb4.sql

Убедитесь, что файл дампа создан и имеет ненулевой размер:

ls -lh /home/backup_before_utf8mb4.sql

Шаг 2: Конвертация базы данных и таблиц через SQL

Подключитесь к MySQL и выполните следующие команды. Сначала меняем charset самой базы данных:

ALTER DATABASE название_базы CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Затем нужно конвертировать каждую таблицу. Если таблиц много, удобнее сгенерировать команды автоматически:

SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'название_базы'
AND TABLE_TYPE = 'BASE TABLE';

Скопируйте и выполните полученные ALTER TABLE команды. Для небольших баз это можно сделать одной процедурой. Обратите внимание: конвертация таблиц может занять несколько минут на больших объёмах данных — в этот момент таблицы будут заблокированы для записи.

Шаг 3: Изменение настроек подключения в Битрикс

После конвертации БД нужно сообщить Битриксу, что соединение должно использовать utf8mb4. Откройте файл настроек подключения:

/bitrix/.settings.php

Найдите секцию connections и добавьте параметры charset:

'connections' => array(
    'value' => array(
        'default' => array(
            'className' => '\\Bitrix\\Main\\DB\\MysqliConnection',
            'host' => 'localhost',
            'database' => 'название_базы',
            'login' => 'пользователь',
            'password' => 'пароль',
            'options' => 2,
            'charset' => 'utf8mb4',  // добавить эту строку
        ),
    ),
),

Также откройте файл /bitrix/php_interface/dbconn.php и убедитесь, что в нём указан правильный charset, либо добавьте строку после подключения к БД:

$DBType = "mysql";
$DBHost = "localhost";
$DBLogin = "пользователь";
$DBPassword = "пароль";
$DBName = "название_базы";
$DBCharset = "utf8mb4";

Шаг 4: Изменение конфигурации MySQL (my.cnf / my.ini)

Чтобы изменения были постоянными и новые соединения по умолчанию использовали utf8mb4, отредактируйте конфигурационный файл MySQL. На Linux обычно это /etc/mysql/my.cnf или /etc/my.cnf:

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

После редактирования перезапустите MySQL:

systemctl restart mysql
# или для более старых систем:
service mysql restart

Шаг 5: Проверка поддержки emoji

Проверьте текущие настройки charset в MySQL после перезапуска:

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

Все переменные character_set_* должны показывать utf8mb4. После этого зайдите на сайт или в Битрикс24 и попробуйте сохранить текст с emoji — например, сохраните комментарий к сделке в CRM с символом 😀.

Возможные ошибки и их решение

Ошибка: Specified key was too long; max key length is 767 bytes

Эта ошибка возникает при конвертации таблиц с индексами по длинным VARCHAR-полям. utf8mb4 использует до 4 байт на символ, что увеличивает размер индексов. Решение — включить innodb_large_prefix и innodb_file_format = Barracuda в my.cnf, либо уменьшить длину индексируемого поля.

Ошибка: Incorrect string value при вставке

Если конвертация выполнена, но ошибка сохраняется — проверьте, что charset соединения действительно utf8mb4. Выполните после подключения:

SET NAMES utf8mb4;
SHOW VARIABLES LIKE 'character_set_connection';

Битрикс не видит изменения после редактирования .settings.php

Очистите кэш Битрикса: удалите содержимое директории /bitrix/cache/ и /bitrix/managed_cache/, либо воспользуйтесь инструментом очистки кэша в административной панели через Настройки → Производительность → Очистить кэш.

После выполнения всех шагов ваш сайт на Битрикс полностью поддерживает emoji и любые четырёхбайтовые Unicode-символы. Конвертация в utf8mb4 — это также хорошая практика для обеспечения совместимости с современными стандартами хранения данных.