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

Если сообщение с emoji в CRM Битрикс24 или на сайте «1С-Битрикс» сохраняется со знаками вопроса, обрезается на смайлике или падает с ошибкой Incorrect string value, причина почти всегда одна: база или соединение работают в utf8 (он же utf8mb3) вместо utf8mb4. Ниже порядок перевода базы, подключения Битрикса и my.cnf, с отдельными настройками для MySQL 8.x и MariaDB.

Коротко:

  • Сделайте дамп, потом переведите базу и таблицы в utf8mb4.
  • Сортировка: для MySQL 8.x Битрикс рекомендует utf8mb4_0900_ai_ci, для MariaDB 10.x/11.x — utf8mb4_unicode_ci.
  • Соединение: ключ 'charset' => 'utf8mb4' в /bitrix/.settings.php и согласованная команда SET NAMES в after_connect_d7.php.
  • В my.cnf для MySQL 8.0+ не пишите innodb_large_prefix и innodb_file_format, для 8.4 ещё и character-set-client-handshake: сервер с ними не стартует.

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

Кодировка utf8 в MySQL — это не полный UTF-8. Она хранит символы длиной до 3 байт, а большинству emoji нужно 4 байта (символы из дополнительных плоскостей Unicode). При вставке такого символа в столбец utf8mb3 строгий режим MySQL возвращает ошибку ERROR 1366 Incorrect string value: '\xF0\x9F\x91\x8D', а нестрогий обрезает строку или подставляет знак вопроса.

Решение — перевести базу, таблицы и соединение в utf8mb4 («mb4» — multi-byte, до 4 байт). Эта кодировка покрывает весь диапазон Unicode, включая emoji. В требованиях Битрикса к серверу utf8mb4 прямо указана вместо utf8mb3.

Какую сортировку выбрать

По требованиям Битрикса к серверному ПО (урок обновлён 16.01.2026):

  • MySQL 8.x и 9.x: кодировка utf8mb4, сортировка utf8mb4_0900_ai_ci;
  • MariaDB 10.x и 11.x: кодировка utf8mb4, сортировка utf8mb4_unicode_ci.

Узнать, что у вас за сервер, можно запросом SELECT VERSION();. В примерах ниже стоит utf8mb4_0900_ai_ci, на MariaDB подставьте utf8mb4_unicode_ci. Главное — одна сортировка на всю базу: таблицы с utf8mb4_unicode_ci рядом с таблицами в utf8mb4_0900_ai_ci дают в JOIN ошибку Illegal mix of collations. Подробнее этот случай разобран в заметке про переход Битрикса на MySQL 8.4.

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

Перед любыми изменениями в базе обязательно сделайте дамп. Ключ --default-character-set=utf8mb4 не даст клиенту испортить уже записанные четырёхбайтовые символы:

mysqldump -u root -p --single-transaction --default-character-set=utf8mb4 название_базы > /home/backup_before_utf8mb4.sql

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

ls -lh /home/backup_before_utf8mb4.sql

На боевом сайте конвертацию лучше сначала прогнать на тестовой копии: так советует и документация Битрикса по кодировкам.

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

Сначала посмотрите, какие таблицы ещё не в нужной сортировке:

SELECT TABLE_NAME, TABLE_COLLATION
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'название_базы'
  AND TABLE_TYPE = 'BASE TABLE'
  AND TABLE_COLLATION <> 'utf8mb4_0900_ai_ci';

Затем меняем кодировку по умолчанию у самой базы. Она влияет на новые таблицы, существующие не трогает:

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

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

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

Скопируйте и выполните полученные команды ALTER TABLE. Удобно сохранить их в файл и прогнать через консольный клиент:

mysql -u root -p -N -e "SELECT CONCAT('ALTER TABLE \`', TABLE_NAME, '\` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;') FROM information_schema.TABLES WHERE TABLE_SCHEMA='название_базы' AND TABLE_TYPE='BASE TABLE' AND TABLE_COLLATION <> 'utf8mb4_0900_ai_ci'" > /home/convert.sql
mysql -u root -p название_базы < /home/convert.sql

На больших таблицах конвертация идёт долго, и всё это время таблица недоступна для записи. Крупные таблицы (поиск, статистика, логи) переводите в окно работ.

Шаг 3: Кодировка соединения в Битрикс

После конвертации базы нужно, чтобы и соединение Битрикса шло в utf8mb4. Документация Битрикса проверяет два места: параметры подключения и команды после подключения.

Параметры подключения. В /bitrix/.settings.php, в секции connections, для MysqliConnection можно указать ключ charset. Ядро передаёт его в mysqli::set_charset():

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

Команды после подключения. После соединения D7-ядро подключает /bitrix/php_interface/after_connect_d7.php. В старых установках там часто стоит SET NAMES 'utf8' и collation_connection = utf8_unicode_ci, и они откатывают соединение обратно в utf8mb3. Замените их одной командой с той же сортировкой, что у таблиц:

<?php
// MySQL 8.x
$this->queryExecute("SET NAMES 'utf8mb4' COLLATE 'utf8mb4_0900_ai_ci'");
// MariaDB: $this->queryExecute("SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'");

Если в проекте есть старый /bitrix/php_interface/after_connect.php, в нём должна быть та же кодировка. В /bitrix/php_interface/dbconn.php не должно остаться настроек однобайтовых кодировок вроде setlocale(LC_ALL, 'ru_RU.CP1251').

Ещё одна частая находка в after_connect_d7.php — строка SET innodb_strict_mode=0. На MySQL 8 у обычного пользователя сайта она даёт ошибку доступа 1227, разбор тоже есть в заметке про MySQL 8.4.

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

Чтобы новые базы и соединения по умолчанию получали utf8mb4, задайте кодировку сервера. На Linux конфиг обычно лежит в /etc/mysql/my.cnf или /etc/my.cnf, а на BitrixVM свои параметры удобнее держать в отдельном файле из каталога !includedir. Как найти активный конфиг, описано в заметке про max_allowed_packet на BitrixVM.

Для MySQL 8.x:

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci

Для MariaDB замените последнюю строку на collation-server = utf8mb4_unicode_ci.

В старых инструкциях в секцию [mysqld] добавляют ещё character-set-client-handshake = FALSE. На MySQL 8.4.11 с этой строкой сервер не запускается: unknown variable 'character-set-client-handshake=FALSE'. На 8.0.46 она ещё принимается, но толку от неё мало: кодировку соединения Битрикс задаёт сам (шаг 3). Строки innodb_large_prefix и innodb_file_format не принимает уже MySQL 8.0, об этом ниже.

Проверить конфиг до рестарта можно командой mysqld --validate-config: при ошибке она выходит с кодом 1 и печатает строку, которая мешает. Пример с распакованным архивом новой версии MySQL есть в разборе перехода на 8.4.

После правки перезапустите сервер:

systemctl restart mysqld
# на Debian/Ubuntu служба обычно называется mysql, на MariaDB - mariadb

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

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

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

Переменные character_set_server, character_set_database, character_set_connection, character_set_results и character_set_client должны показывать utf8mb4. character_set_system остаётся utf8mb3, это нормально: это кодировка имён объектов, а не данных. character_set_filesystem обычно binary.

Затем запустите в админке Настройки → Инструменты → Проверка системы: она сравнивает кодировку соединения, результатов, базы, таблиц и полей. И в конце сохраните на сайте или в Битрикс24 текст с emoji, например комментарий к сделке с символом 😀.

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

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

utf8mb4 тратит до 4 байт на символ, поэтому индекс по VARCHAR(255) занимает до 1020 байт. Лимит 767 байт действует для формата строк COMPACT и REDUNDANT. Для DYNAMIC и COMPRESSED лимит префикса индекса — 3072 байта.

  • MySQL 8.0 и новее. DYNAMIC стоит по умолчанию, ошибка возникает только у таблиц, созданных когда-то в старом формате. Переведите такую таблицу: ALTER TABLE имя_таблицы ROW_FORMAT=DYNAMIC;, затем повторите конвертацию. Параметров innodb_large_prefix и innodb_file_format в 8.0 нет: с ними в my.cnf сервер не стартует (unknown variable 'innodb_large_prefix=1').
  • MySQL 5.6 и 5.7. Здесь эти параметры ещё есть, и раньше их включали в my.cnf. Учтите, что Битрикс требует MySQL 8.0 и выше, так что базу на 5.7 всё равно предстоит обновлять.

Узнать формат строк таблиц:

SELECT TABLE_NAME, ROW_FORMAT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'название_базы'
  AND ROW_FORMAT IN ('Compact', 'Redundant');

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

Если таблица уже в utf8mb4, а ошибка остаётся, проверьте два места. Первое — сам столбец: CONVERT TO меняет все текстовые столбцы, но столбец, у которого кодировку потом задали вручную, мог остаться в utf8mb3. Второе — соединение. Выполните из консоли или из PHP-скрипта сайта:

SHOW VARIABLES LIKE 'character_set_connection';
SHOW FULL COLUMNS FROM имя_таблицы;

Если character_set_connection у сайта показывает utf8mb3, значит, after_connect_d7.php или after_connect.php всё ещё переключает соединение (шаг 3).

Ошибка: Illegal mix of collations

Часть таблиц переведена в utf8mb4_unicode_ci, часть создана с сортировкой сервера utf8mb4_0900_ai_ci. Запрос из шага 2 покажет таблицы с отличающейся сортировкой, их нужно привести к одной.

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

Очистите кэш Битрикса: удалите содержимое каталогов /bitrix/cache/ и /bitrix/managed_cache/ или воспользуйтесь очисткой кэша в админке: Настройки → Настройки продукта → Автокеширование → Очистка файлов кеша. Если включён OPcache с opcache.validate_timestamps=0, после правки PHP-файлов перезапустите PHP-FPM.

Итог

Emoji начинают сохраняться, когда utf8mb4 стоит на всех уровнях сразу: у таблиц и столбцов, у соединения Битрикса и, для новых баз, у сервера. Сортировку берите по типу СУБД (utf8mb4_0900_ai_ci для MySQL 8.x, utf8mb4_unicode_ci для MariaDB) и держите одинаковой во всей базе. Устаревшие строки my.cnf из старых инструкций проверяйте до рестарта, иначе после правки кодировки сервер может не подняться.

Рядом по теме: Битрикс на MySQL 8.4: my.cnf, mysql_native_password и проверка базы, перенос Битрикса на новый хостинг.