Потому что база данных использует кодировку utf8 (3 байта), а эмоджи требуют utf8mb4 (4 байта). MySQL не может сохранить символ и заменяет его на “?”.
Почему в MODX Revo не работают эмоджи и как включить utf8mb4
Содержание:
Вы добавляете в описание товара лёгкую улыбку 🙂.
Сохраняете.
Обновляете страницу.
А вместо улыбки — квадратик. Или четыре вопросительных знака. Или вообще пустота.
В этот момент обычно подозрение падает на MODX.
Но давайте сразу расставим акценты: MODX Revo здесь почти никогда не виноват. Он честно сохраняет строку. Проблема обычно глубже — на уровне кодировки базы данных.
Разберёмся спокойно и по-взрослому, без магии.
Почему так происходит
Почти во всех случаях причина одна — база данных работает в старой кодировке utf8, тогда как эмоджи требуют utf8mb4.
И здесь важно понимать одну деталь.
В MySQL кодировка utf8 — это не «полный UTF-8».
Она поддерживает только до 3 байт на символ.
А большинство эмоджи — это 4-байтные символы.
То есть для базы в utf8 смайлик 🙂 — это не буква.
Это что-то непонятное.
Поэтому она заменяет его на ? или просто отбрасывает.
Чтобы эмоджи сохранялись корректно, нужна кодировка utf8mb4.
Шаг первый: проверяем, что сейчас используется
Подключаемся к базе (через phpMyAdmin или консоль) и выполняем:
SHOW VARIABLES LIKE 'character_set%';
Нас интересуют значения:
character_set_databasecharacter_set_servercharacter_set_connection
Если вы видите utf8 — значит база работает в старом режиме.
Также можно проверить конкретную базу:
SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'имя_вашей_базы';
Если снова utf8, то эмоджи физически не смогут сохраняться корректно.
Шаг второй: переводим базу в utf8mb4
Перед любыми изменениями — обязательно сделайте бэкап базы.
Далее выполняем:
ALTER DATABASE имя_вашей_базы CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
Но этого недостаточно.
Нужно перевести и все таблицы:
ALTER TABLE имя_таблицы CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Для проекта на MODX Revo это придётся сделать для всех таблиц.
Важный момент: индексы и длина полей
При переходе на utf8mb4 возможна ошибка:
Specified key was too long
Это происходит потому, что в старых версиях MySQL длина индекса ограничена 767 байтами.
А utf8mb4 использует до 4 байт на символ.
Решение — уменьшить длину индексируемого поля до 191 символа:
ALTER TABLE имя_таблицы MODIFY поле VARCHAR(191);
Если сервер современный (MySQL 5.7+ или MariaDB 10.2+) — этой проблемы обычно нет.
Шаг третий: проверяем настройки подключения MODX
Даже если база переведена в utf8mb4, соединение тоже должно использовать эту кодировку.
В MODX Revo это настраивается в файле:
core/config/config.inc.php
Также проверьте в системных настройках:
database_charsetcharset
Они должны быть выставлены корректно.
После изменений — обязательно очистите кэш MODX.
После перехода на utf8mb4
Когда база, таблицы и соединение настроены правильно:
- эмоджи сохраняются корректно
- выводятся без искажений
- не заменяются на
? - не ломают текст
И можно спокойно использовать символы в описаниях, заголовках, новостях, товарах.
Без обходных решений. Без костылей. Без фильтров и дополнительных обработчиков.
Итог
Если в MODX Revo «не работают» эмоджи, причина почти всегда одна — старая кодировка utf8.
Решение — переход на utf8mb4.
Это не доработка шаблона.
Не ошибка сниппета.
Не баг движка.
Это вопрос правильной настройки базы данных.
После корректного перехода MODX спокойно работает с современными символами — так же, как и любой другой современный веб-проект.
И да, MODX не против эмоджи 🙂
Ему просто нужно говорить на правильном языке.
Вопрос? Ответ
Нет. В большинстве случаев проблема не в шаблоне и не в MODX, а в настройках базы данных и соединения.
Да. MODX корректно работает с эмоджи при условии, что база данных и соединение настроены на utf8mb4.
Да. Недостаточно изменить только кодировку базы — необходимо конвертировать все таблицы в utf8mb4, иначе часть данных может продолжать сохраняться некорректно.
Это связано с длиной индексов при использовании utf8mb4. Обычно проблему решает уменьшение индексируемых полей до 191 символа или обновление версии MySQL.
Да, но перед изменениями обязательно сделайте резервную копию базы данных и протестируйте изменения на копии проекта.
