Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Выбор кодировки для MySQL

Начал свой проект, хочется сразу использовать лучшие наработки.
Понял, что одна из utf8_general_ci или utf8_unicode_ci. Склоняюсь к utf8_unicode_ci
Но наткнулся на информацию, что это немного уже устарело и стоит использовать utf8mb4_general_ci и utf8mb4_unicode_ci
Посоветуйте какую кодировку выбрать для БД.


Ответ

Вольный перевод вопроса What's the difference between utf8_general_ci and utf8_unicode_ci
Обе эти кодировки (utf8_general_ci и utf8_unicode_ci) работают с символами UTF-8, разница в сортировке строк и их сравнении.
Заметьте: начиная с MySQL версии 5.5.3 предпочтительнее использовать utf8mb4, а не utf8. Они обе являются кодировками UTF-8, но более старая uft8 имеет специфические для MySQL ограничения символов UTF-8 выше 0xFFFD.
Сравнение по отдельным параметрам.
Точность
utf8mb4_unicode_ci основана на стандарте Unicode по сортировке и сравнению строк, который более точно сортирует строки в широком диапазоне языков/алфавитов. utf8mb4_general_ci не реализует все правила сортировки Unicode, что зачастую влечёт нежелательный результат в некоторых ситуациях для определённых языков/символов.
Производительность
utf8mb4_general_ci быстрее в сравнении и сортировке, потому что она содержит большое число оптимизаций.
На современных серверах, это приращение скорости будет всегда, но незначительно. Оптимизации были задуманы во время, когда мощности серверов были значительно меньше сегодняшних. utf8mb4_unicode_ci, которое использует правила Unicode для сортировки и сравнения, по-честному использует более сложные алгоритмы для точной сортировки для широкого числа языков и при использовании спецсимволов. Эти правила принимают во внимание специфические соглашения для языка, не всегда сортировки идёт в соответствии с "алфавитным" порядком.
В принципе, для группы т.н. "европейских" языков нет особой разницы между строгой сортировкой по Unicode и упрощенной сортировкой utf8mb4_general_ci, но несколько различий:
Например, Unicode сортирует "ß" так же как и "ss", и "Œ" как "OE" так же как это делают люди, в то время как utf8mb4_general_ci сортирует их как отдельные символы (предположительно как "s" и "e" соответственно).
Некоторые символы Unicode определены как незначимые, что означает, что они не должны влиять на порядок сортировки и сравнение должно переходить к следующему символу. И utf8mb4_unicode_ci обрабатывает эти символы корректно.
Для группы неевропейских языков, таких как азиатские языки или языки с другим алфавитом существует гораздо больше различий между сортировкой Unicode и упрощённой сортировкой в utf8mb4_general_ci. То, насколько подходит utf8mb4_general_ci будет зависеть от конкретного языка. Для некоторых языков разница может быть сильно недостаточной.
Что же использовать?
Практически нет смысла предпочитать utf8mb4_general_ci по соображениям производительности, потому что на современных процессорах разница не будет играть роль "бутылочного горлышка".
Какая-то разница в производительности может быть в каких чрезмерно специализированных ситуациях и если это ваш случай вы должны знать об этом.
Раньше некоторые специалисты рекомендовали использовать utf8mb4_general_ci кроме тех случаев, когда необходима точная сортировка и это важнее проседания производительности. Сегодня больше обращают внимание на точную поддержку интернационализации, чем на незначительное проседание производительности.
И ещё я добавлю, что даже если ваше приложение должно поддерживать только английский язык - в нём может оказаться ситуация, когда в приложении будут вводиться имена людей и часто вводимые имена должны содержать символы, которые встречаются в других языках, поэтому так важно использовать корректные правила сортировки. Использование Unicode во всех местах, где это возможно, поможет вам разработать более качественные приложения.

Комментариев нет:

Отправить комментарий