Если сообщение с 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 и проверка базы, перенос Битрикса на новый хостинг.
