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

Кодировка символов является основой того, как данные хранятся, запрашиваются и отображаются в современных приложениях и хостинг-средах. Если вы запускаете веб-сайт или веб-приложение на общем хостинге, VPS или выделенном сервере, работающем на MySQL или MariaDB, вы, вероятно, сталкивались с терминами utf8 и utf8mb4. На первый взгляд они кажутся синонимами — оба представляют кодировки Unicode. Но на самом деле существует критическое различие, которое может повлиять на способность вашего приложения хранить современные текстовые данные, такие как эмодзи, многоязычный контент или определенные символы CJK (китайские, японские, корейские) — особенно в интернационализированных или многоязычных хостинг-решениях.

Определения

utf8

  • Унаследованная кодировка Unicode MySQL.

  • Поддерживает только 3 байта на символ.

  • Способна хранить символы в Основной многоязычной плоскости (BMP): U+0000 до U+FFFF.

  • Не может хранить эмодзи, музыкальные символы, определенные китайские символы и другие дополнительные символы.

utf8mb4 (Многобайтовая 4)

  • Настоящая реализация UTF-8.

  • Поддерживает полный Unicode, включая символы за пределами 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
Покрытие UnicodeДо U+FFFF (только BMP)Полный диапазон (до U+10FFFF)
Поддержка эмодзи❌ Нет✅ Да
Поддержка дополнительных символов❌ Нет✅ Да
Совместимость с MySQL✅ Безопасно для унаследованных систем✅ Полный Unicode
Опции сортировкиОграниченныеБолее обширные (например, utf8mb4_0900_ai_ci)

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

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

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

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

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

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

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

  • utf8mb4_0900_ai_ci: Современная сортировка, учитывающая Unicode 9.0 (доступна в MySQL 8+)

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

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

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

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

ERROR 1366 (HY000): Incorrect string value: 'xF0x9Fx98x81' 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 для производительности.

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

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

Заключение

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