Почему важно использовать кодировку utf8mb4_unicode_ci в MySQL/MariaDB вместо обычной utf8?
Многие разработчики, работающие с MySQL или MariaDB, по умолчанию выбирают кодировку `utf8`, считая её полноценной поддержкой Unicode. Однако это распространённое заблуждение, которое может привести к серьёзным проблемам.
## Проблема с utf8 в MySQL
Кодировка `utf8` в MySQL — это не настоящий UTF-8. Она поддерживает только символы, кодируемые 1–3 байтами, то есть охватывает лишь базовую многоязычную плоскость Unicode (BMP). Это означает, что символы, требующие 4 байта — например, большинство эмодзи (😊, 🔥), некоторые китайские иероглифы и специальные математические символы — просто не будут сохранены. Вместо них в базу запишется пустая строка или возникнет ошибка.
## Что такое utf8mb4?
`utf8mb4` — это «настоящий» UTF-8, поддерживающий все символы Unicode, включая 4-байтовые. Приставка `mb4` означает «multi-byte 4», то есть поддержку до 4 байт на символ. Именно эта кодировка полностью соответствует стандарту Unicode и является рекомендуемой для всех современных приложений.
## Зачем нужен суффикс _unicode_ci?
Суффикс `_ci` означает «case insensitive» — регистронезависимое сравнение. Суффикс `_unicode_ci` указывает, что сравнение строк выполняется по правилам Unicode Collation Algorithm (UCA). Это обеспечивает корректную сортировку и сравнение строк на разных языках, включая русский, немецкий, французский и другие.
Альтернатива `utf8mb4_general_ci` работает быстрее, но менее точна: она не учитывает некоторые языковые особенности при сортировке. `utf8mb4_unicode_ci` более корректна с лингвистической точки зрения.
## Практические последствия использования utf8
— **Потеря данных**: эмодзи и редкие символы не сохраняются.
— **Ошибки приложения**: попытка вставить 4-байтовый символ вызывает исключение.
— **Проблемы с поиском**: некорректная сортировка и сравнение строк на нелатинских языках.
— **Уязвимости безопасности**: в некоторых версиях MySQL некорректная обработка многобайтовых символов использовалась для SQL-инъекций.
## Как перейти на utf8mb4_unicode_ci?
1. Измените настройки сервера в `my.cnf`:
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
2. Конвертируйте существующие базы и таблицы:
sql
ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3. Убедитесь, что соединение с базой данных также использует utf8mb4.
## Итог
Использование `utf8mb4_unicode_ci` — это не просто рекомендация, а необходимость для любого современного приложения, работающего с многоязычным контентом или пользовательскими данными. Это гарантирует полную поддержку Unicode, корректную сортировку и защиту от потери данных.
