Вход Регистрация
СтатьиСкачатьУслугиАудиоКонтакты
ruen

Какую кодировку выбрать в MySQL - utf8 или utf8mb4 (utf8mb4_general_ci, utf8mb4_unicode_ci или utf8mb4_0900_ai_ci). Чем они отличаются, как расшифровываются и возможные ошибки

При настройке подключения к базе данных (БД) может возникнуть затруднение при выборе кодировки БД. Обычно предлагается целый список кодировок, а точнее сопоставлений (сравнений или наборов символов) и в каждой версии СУБД предлагаемая кодировка может отличаться.

kakuyu-kodirovku-vybrat-v-mysql

Например, ранее по умолчанию предлагался набор utf8_general_ci. Пользователь может не знать, какая кодировка используется, так как выбор может происходить автоматически при установки готовых веб-приложений. Кодировка может применяться по умолчанию при создании базы данных вручную при помощи, например, phpMyAdmin. Выбранная кодировка распространяется на все таблицы БД и это влияет на то, как будут обрабатываться данные при запросах. Например, может обнаружиться, что при выборке данных не учитывается регистр или, не сохраняются некоторые символы из других языков и прочие объекты (смайлы и т.д.).

Какую кодировку выбрать для БД и таблиц? Для большинства проектов рекомендуется выбирать из подмножества кодировок, относящихся к utf8. Но здесь есть отличия в названиях сопоставлений. Сопоставления utf8 являются 3-ех байтными, для простоты у них не указывается mb3. Обычная utf8 имеет специфичные ограничения MySQL, которые не позволяют использовать символы выше 0xFFFD.

Для старых приложений возможно стоит использовать utf8_general_ci, для новых – utf8mb4_general_ci, utf8mb4_unicode_ci или utf8mb4_0900_ai_ci. Предпочтительным вариантом является не general, а unicode. Отличаются они тем, что utf8mb4_general_ci немного быстрее при выполнении сортировки, но могут возникать проблемы с сортировкой для некоторых языков, в то время как utf8mb4_unicode_ci не имеет подобного недостатка.

Как расшифровываются названия кодировок? Рассмотрим на примере utf8mb4_0900_ai_ci. Здесь:

utf8 обозначает кодировку;

mb4 обозначает версию или сколько байт используется в обработке данных для одного символа. Если не указано, то обычно подразумевается mb3;

0900 обозначает версию алгоритма сопоставления Unicode (UCA), на которой базируется сопоставление. Если не указано, то обычно подразумевается версия 4.0.0;

ai обозначает нечувствительность к диакритическим знакам (например, древнегреческие ᾱ, ᾰ). Если не указано, подразумевается ai или as в зависимости от следующей части в имени сравнения, то есть ai для ci и as для cs;

ci обозначает нечувствительность к регистру, означает, что не будет разницы между строчными и заглавными символами в запросах к БД. Существуют также версии cs, которые являются чувствительными к регистру.

Различные ошибки и предупреждения можно увидеть в отчете используемой системы. Там обычно предлагается перейти на использования современных кодировок из комплекта utf8mb4. Например, в Drupal в отчете состояния можно увидеть строку:

Database 4 byte UTF-8 support – Отключено. 4 byte UTF-8 for mysql is disabled. See the documentation on adding 4 byte UTF-8 support for more information.

Это означает, что система рекомендует использовать новые 4-ех байтные кодировки взамен старых из коллекции utf8.

При написании программного кода может возникать ошибка вида: Unknown collation: 'utf8mb4_0900_ai_ci' (Неизвестное сопоставление: 'utf8mb4_0900_ai_ci'). Это в большинстве случае означает отсутствие требуемой кодировки на сервере баз данных. Например, utf8mb4_0900_ai_ci – это новое сопоставление, доступное только начиная с MySQL 8.0. Также ошибка может появиться в случае применения кодировки, предназначенной для MySQL в другой СУБД, например, в MariaDB. Наборы кодировок различаются от версии к версии, а также для разных СУБД.

Комментарии (0)
Для комментирования войдите или зарегистрируйтесь.

Последние статьи

Популярные разделы

Общение

Вход в веб-версию
Приложение для Android:
Доступно в Google Play

Поделиться

Подписаться