Dushan
від в 14/09/2020
74 переглядів

Вкратце: utf8_unicode_ci использует алгоритм сортировки Unicode, как определено в стандартах Unicode, тогда как utf8_general_ci это более простой порядок сортировки, который приводит к «менее точным» результатам сортировки.

Оба эти сопоставления предназначены для кодировки символов UTF-8. Различия заключаются лишь в том, как текст сортируется и сравнивается.

Примечание: в MySQL вы должны использовать utf8mb4 вместо utf8. Как ни странно, utf8 это некорректная реализация UTF-8 из ранних версий MySQL, которая осталась только для обратной совместимости. Фиксированной версии было дано имя utf8mb4.

Важное примечание. В более новых версиях MySQL обновлены правила сортировки Unicode, доступные под именами, например, utf8mb4_0900_ai_ci для эквивалентных правил, основанных на Unicode 9.0, и без эквивалентного _general варианта. Люди, читающие это сейчас, вероятно, должны использовать одно из этих новых сопоставлений вместо _unicode или _general . Многое из того, что написано ниже, больше не представляет особого интереса, если вместо этого вы можете использовать одно из новых сопоставлений.

 

Ключевые отличия

  • utf8mb4_unicode_ci основан на официальных правилах Unicode для универсальной сортировки и сравнения, что обеспечивает точную сортировку на широком диапазоне языков.

  • utf8mb4_general_ci представляет собой упрощенный набор правил сортировки, цель которого - делать все, что в его силах, но при этом использовать множество сокращений, предназначенных для повышения скорости. Он не соответствует правилам Unicode и в некоторых ситуациях приведет к нежелательной сортировке или сравнению, например, при использовании определенных языков или символов.

  • На современных серверах это повышение производительности будет почти незначительным. Он был изобретен в то время, когда серверы обладали крошечной долей производительности ЦП современных компьютеров.

 

Преимущества utf8mb4_unicode_ci над utf8mb4_general_ci

utf8mb4_unicode_ci, который использует правила Юникода для сортировки и сравнения, применяет довольно сложный алгоритм для правильной сортировки в широком диапазоне языков и при использовании широкого диапазона специальных символов. Эти правила должны учитывать языковые соглашения; не все сортируют своих персонажей в так называемом «алфавитном порядке».

Что касается латинских (т.е. «европейских») языков, то между сортировкой Unicode и упрощенной utf8mb4_general_ci сортировкой MySQL нет большой разницы, но все же есть несколько отличий:

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

Есть аргумент, что если для вас важнее скорость, чем точность, вы можете вообще не выполнять никакой сортировки. Сделать алгоритм быстрее - тривиально, если он вам не нужен. Итак, utf8mb4_general_ci это компромисс, который, вероятно, не нужен по соображениям скорости и, вероятно, также не подходит по соображениям точности.

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

 

Что означают части

Во-первых, ci это сортировка и сравнение без учета регистра. Это означает, что он подходит для текстовых данных, и регистр не важен. Другие типы сопоставления cs (с учетом регистра) для текстовых данных, где регистр важен, и bin, если кодировка должна совпадать, бит за битом, что подходит для полей, которые действительно являются кодированными двоичными данными (включая, например, Base64). Сортировка с учетом регистра приводит к некоторым странным результатам, а сравнение с учетом регистра может привести к дублированным значениям, различающимся только регистром букв, поэтому сопоставления с учетом регистра не подходят для текстовых данных - если регистр важен для вас, то иначе игнорируемая пунктуация и так далее, вероятно, также имеет значение, и двоичное сопоставление может быть более подходящим.

Далее unicode или general относится к конкретным правилам сортировки и сравнения - в частности, способу нормализации или сравнения текста. Существует множество различных наборов правил для кодировки символов utf8mb4, два из которых unicodeи general являются двумя, которые пытаются хорошо работать на всех возможных языках, а не на одном конкретном. Различия между этими двумя наборами правил и являются предметом этого ответа. Обратите внимание, что unicode используются правила Unicode 4.0. Последние версии MySQL добавляют наборы правил, unicode_520 используя правила Unicode 5.2, и 0900 (отбрасывая часть «unicode_»), используя правила Unicode 9.0.

И, наконец, utf8mb4 это, конечно, внутренняя кодировка символов. В этом ответе я говорю только о кодировках на основе Unicode.

Опубліковано в: Навчання, Технології
Будьте першою людиною, якій це подобається