В чем разница между utf8 и utf8mb4 в MySQL?

Кодировка символов является основополагающей для хранения, запроса и отображения данных в современных приложениях и хостинговых средах. Если вы используете веб-сайт или веб-приложение на виртуальном хостинге, 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.

  • Требуется для хранения эмодзи (😊), редких китайских иероглифов (𠀋) или математических символов (𝛑).

Вводящий в заблуждение utf8 в MySQL

В MySQL набор символов utf8 не является полной реализацией стандарта UTF-8. Он ограничен 3 байтами, в то время как стандартный UTF-8 использует до 4 байт. Это означает:

  • utf8 в MySQL – это не настоящий UTF-8.

  • Это скорее подмножество UTF-8, исключающее кодовые точки за пределами U FFFF.

В отличие от него, utf8mb4 полностью соответствует стандарту UTF-8.

Техническое сравнение

Характеристикаutf8utf8mb4
Максимальное количество байт на символ34
Охват ЮникодаДо U FFFF (только BMP)Полный диапазон (до U 10FFFF)
Поддержка эмодзи❌ Нет✅ Да
Поддержка дополнительных символов❌ Нет✅ Да
Совместимость с MySQL✅ Безопасность для наследия✅ Полный Юникод
Опции колляцииОграниченныеБолее широкие (например, utf8mb4_0900_ai_ci)

Почему utf8mb4 – это правильный выбор

1. Поддержка эмодзи и современных символов

Вы не можете хранить 🐱, 🧠, 🚀 или 🇩🇪, используя utf8 в MySQL. Они находятся за пределами BMP.

2. Улучшенная свертка и сортировка

utf8mb4 поддерживает новые коллизии, такие как:

  • utf8mb4_unicode_ci: сортировка по стандарту Юникода

  • utf8mb4_general_ci: Быстрая, но менее точная

  • utf8mb4_0900_ai_ci: Современная сортировка с поддержкой Unicode 9.0 (доступна в MySQL 8)

3. Защита на будущее

По мере расширения Unicode новые символы будут выходить за пределы 3-байтового диапазона. utf8mb4 гарантирует, что вы не будете заблокированы от будущих символов.

Что произойдет, если вы используете utf8?

Если вы попытаетесь вставить 4-байтовый символ (например, эмодзи) в столбец с , вы получите эту ошибку:

ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x98\x81' for column 'title' at row 1

Хуже того, ваше приложение может беззвучно усечь или испортить данные, если они не проверены должным образом.

Миграция с utf8 на utf8mb4

Чтобы безопасно перенести схему, выполните следующие шаги:

Шаг 1: Обновите определения таблиц и столбцов

ALTER TABLE my_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Шаг 2: Обновите настройки базы данных по умолчанию

ALTER DATABASE my_db CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

Шаг 3: Обновите настройки подключения приложения

Убедитесь, что ваше приложение подключается с использованием utf8mb4:

SET NAMES utf8mb4;

Лучшие практики

  • Всегда используйте utf8mb4 для новых баз данных.

  • ✅ Используйте utf8mb4_unicode_ci для точности или utf8mb4_general_ci для производительности.

  • ✅ Установите charset по умолчанию на уровне таблиц и баз данных.

  • ✅ Убедитесь, что библиотеки прикладного уровня (например, PDO, MySQLi, Sequelize) поддерживают utf8mb4.

Заключение

Разница между utf8 и utf8mb4 в MySQL – это не просто байт, это разница между совместимостью с современным Юникодом и молчаливым отказом. Хотя utf8 остается обратно совместимым, он устарел для многих современных случаев использования. Всегда отдавайте предпочтение utf8mb4, чтобы обезопасить свое приложение на будущее и обеспечить полную поддержку многоязычия, эмодзи и специальных символов.