Главная / Блог ModX / Почему в ModX не работают эмоджи и как исправить

Почему в MODX Revo не работают эмоджи и как включить utf8mb4

Содержание:

Вы добавляете в описание товара лёгкую улыбку 🙂.
Сохраняете.
Обновляете страницу.

А вместо улыбки — квадратик. Или четыре вопросительных знака. Или вообще пустота.

В этот момент обычно подозрение падает на MODX.
Но давайте сразу расставим акценты: MODX Revo здесь почти никогда не виноват. Он честно сохраняет строку. Проблема обычно глубже — на уровне кодировки базы данных.

Разберёмся спокойно и по-взрослому, без магии.


Почему так происходит

Почти во всех случаях причина одна — база данных работает в старой кодировке utf8, тогда как эмоджи требуют utf8mb4.

И здесь важно понимать одну деталь.

В MySQL кодировка utf8 — это не «полный UTF-8».
Она поддерживает только до 3 байт на символ.
А большинство эмоджи — это 4-байтные символы.

То есть для базы в utf8 смайлик 🙂 — это не буква.
Это что-то непонятное.
Поэтому она заменяет его на ? или просто отбрасывает.

Чтобы эмоджи сохранялись корректно, нужна кодировка utf8mb4.


Шаг первый: проверяем, что сейчас используется

Подключаемся к базе (через phpMyAdmin или консоль) и выполняем:

SHOW VARIABLES LIKE 'character_set%';

Нас интересуют значения:

  • character_set_database
  • character_set_server
  • character_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_charset
  • charset

Они должны быть выставлены корректно.

После изменений — обязательно очистите кэш MODX.


После перехода на utf8mb4

Когда база, таблицы и соединение настроены правильно:

  • эмоджи сохраняются корректно
  • выводятся без искажений
  • не заменяются на ?
  • не ломают текст

И можно спокойно использовать символы в описаниях, заголовках, новостях, товарах.

Без обходных решений. Без костылей. Без фильтров и дополнительных обработчиков.


Итог

Если в MODX Revo «не работают» эмоджи, причина почти всегда одна — старая кодировка utf8.

Решение — переход на utf8mb4.

Это не доработка шаблона.
Не ошибка сниппета.
Не баг движка.

Это вопрос правильной настройки базы данных.

После корректного перехода MODX спокойно работает с современными символами — так же, как и любой другой современный веб-проект.

И да, MODX не против эмоджи 🙂
Ему просто нужно говорить на правильном языке.

Вопрос? Ответ

Потому что база данных использует кодировку utf8 (3 байта), а эмоджи требуют utf8mb4 (4 байта). MySQL не может сохранить символ и заменяет его на “?”.

Нет. В большинстве случаев проблема не в шаблоне и не в MODX, а в настройках базы данных и соединения.

Да. MODX корректно работает с эмоджи при условии, что база данных и соединение настроены на utf8mb4.

Да. Недостаточно изменить только кодировку базы — необходимо конвертировать все таблицы в utf8mb4, иначе часть данных может продолжать сохраняться некорректно.

Это связано с длиной индексов при использовании utf8mb4. Обычно проблему решает уменьшение индексируемых полей до 191 символа или обновление версии MySQL.

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

Как бы Вы хотели связаться?

Связь с нами