Страницы

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

четверг, 9 января 2020 г.

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

#mysql #кодировка


Начал свой проект, хочется сразу использовать лучшие наработки. 

Понял, что одна из utf8_general_ci или utf8_unicode_ci.
Склоняюсь к utf8_unicode_ci.

Но наткнулся на информацию, что это немного уже устарело и стоит использовать utf8mb4_general_ci
и utf8mb4_unicode_ci.

Посоветуйте какую кодировку выбрать для БД.
    


Ответы

Ответ 1



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

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

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