Кодировка символов является основополагающей для хранения, запроса и отображения данных в современных приложениях и хостинговых средах. Если вы используете веб-сайт или веб-приложение на виртуальном хостинге, VPS или выделенном сервере с MySQL или MariaDB, вы наверняка сталкивались с терминами utf8 и utf8mb4. На первый взгляд, они кажутся синонимами – оба представляют собой кодировки Юникода. Но под капотом есть критическое различие, которое может повлиять на способность вашего приложения хранить современные текстовые данные, такие как эмодзи, многоязычный контент или некоторые символы CJK (китайский, японский, корейский) – особенно в интернационализированных или многоязычных хостинговых решениях.
utf8
Унаследованная от MySQL кодировка Unicode.
Поддерживает только 3 байта на символ.
Способна хранить символы в базовой многоязычной плоскости (BMP): от U 0000 до U FFFF.
Не может хранить эмодзи, музыкальные символы, некоторые китайские иероглифы и другие дополнительные символы.
utf8mb4
(Multi-Byte 4)Настоящая реализация UTF-8.
Поддерживает полный Юникод, включая символы за пределами BMP.
Использует до 4 байт на символ – как ибыло задумано в UTF-8.
Требуется для хранения эмодзи (😊), редких китайских иероглифов (𠀋) или математических символов (𝛑).
В MySQL набор символов utf8 не является полной реализацией стандарта UTF-8. Он ограничен 3 байтами, в то время как стандартный UTF-8 использует до 4 байт. Это означает:
utf8 в MySQL – это не настоящий UTF-8.
Это скорее подмножество UTF-8, исключающее кодовые точки за пределами U FFFF.
В отличие от него, utf8mb4 полностью соответствует стандарту UTF-8.
Характеристика | utf8 | utf8mb4 |
---|---|---|
Максимальное количество байт на символ | 3 | 4 |
Охват Юникода | До U FFFF (только BMP) | Полный диапазон (до U 10FFFF) |
Поддержка эмодзи | ❌ Нет | ✅ Да |
Поддержка дополнительных символов | ❌ Нет | ✅ Да |
Совместимость с MySQL | ✅ Безопасность для наследия | ✅ Полный Юникод |
Опции колляции | Ограниченные | Более широкие (например, utf8mb4_0900_ai_ci) |
Вы не можете хранить 🐱, 🧠, 🚀 или 🇩🇪, используя utf8 в MySQL. Они находятся за пределами BMP.
utf8mb4 поддерживает новые коллизии, такие как:
utf8mb4_unicode_ci: сортировка по стандарту Юникода
utf8mb4_general_ci: Быстрая, но менее точная
utf8mb4_0900_ai_ci: Современная сортировка с поддержкой Unicode 9.0 (доступна в MySQL 8)
По мере расширения Unicode новые символы будут выходить за пределы 3-байтового диапазона. utf8mb4 гарантирует, что вы не будете заблокированы от будущих символов.
Если вы попытаетесь вставить 4-байтовый символ (например, эмодзи) в столбец с , вы получите эту ошибку:
Хуже того, ваше приложение может беззвучно усечь или испортить данные, если они не проверены должным образом.
Чтобы безопасно перенести схему, выполните следующие шаги:
Убедитесь, что ваше приложение подключается с использованием utf8mb4:
✅ Всегда используйте utf8mb4 для новых баз данных.
✅ Используйте utf8mb4_unicode_ci для точности или utf8mb4_general_ci для производительности.
✅ Установите charset по умолчанию на уровне таблиц и баз данных.
✅ Убедитесь, что библиотеки прикладного уровня (например, PDO, MySQLi, Sequelize) поддерживают utf8mb4.
Разница между utf8 и utf8mb4 в MySQL – это не просто байт, это разница между совместимостью с современным Юникодом и молчаливым отказом. Хотя utf8 остается обратно совместимым, он устарел для многих современных случаев использования. Всегда отдавайте предпочтение utf8mb4, чтобы обезопасить свое приложение на будущее и обеспечить полную поддержку многоязычия, эмодзи и специальных символов.