Какие эффекты имеет использование двоичной сортировки?
Отвечая на этот вопрос, я не понял, что мне не удалось найти достаточный ответ.
Каковы практические различия между использованием двоичных utf8_bin
и нечувствительных к регистру utf8_general_ci
сопоставлений?
Я вижу три:
-
Оба имеют другой порядок сортировки; _bin
порядок сортировки, скорее всего, поместит любые умлауты в конец алфавита, потому что значения байтов сравниваются (справа?)
-
Только чувствительные к регистру поисковые запросы в _bin
-
Нет A = Ä
равенство в _bin
Есть ли какие-либо другие отличия или побочные эффекты, о которых нужно знать?
Ссылка:
Аналогичные вопросы, которые не затрагивают проблему:
Ответы
Ответ 1
Двоичная сортировка сравнивает вашу строку точно так же, как strcmp() в C, если символы различны (это просто случайность или диакритическая разность). Недостатком этого является то, что порядок сортировки не является естественным.
Пример неестественного порядка сортировки (как в "двоичном" ): A, B, a, b
Естественный порядок сортировки был бы в этом случае, например: A, a, B, b (небольшие и капитальные вариации буквы sme сортируются рядом друг с другом)
Практическое преимущество двоичной сортировки - его скорость, поскольку сравнение строк очень просто/быстро. В общем случае индексы с двоичным кодом могут не давать ожидаемых результатов для сортировки, однако для точных совпадений они могут быть полезны.
Ответ 2
utf8_bin
: сравнивает строки по двоичному значению каждого символа в строке.
utf8_general_ci
: сравнивает строки, используя общие языковые правила и используя нечувствительные к регистру сравнения.
utf8_general_cs
: сравнивает строки с использованием общих языковых правил и с помощью проверок, чувствительных к регистру.
Например, следующее будет оцениваться в true с любым из UTF8_general
сопоставлений, но не с сортировкой utf8_bin
:
Ä = A
Ö = O
Ü = U
С помощью сортировки utf8_general_ci
они также возвращают true
, даже если это не тот же случай.
http://www.phpbuilder.com/board/showpost.php?s=2e642ac7dc5fceca2dbca1e2b9c424fd&p=10820221&postcount=2
Ответ 3
Другие ответы хорошо объясняют различия.
В некоторых случаях может быть полезно двоичное сопоставление:
- содержит шестнадцатеричные данные, такие как хэши паролей.
- вас интересуют только точные соответствия, а не сортировка
- для идентификаторов с только символами [a-z0-9_], вы даже можете использовать его для сортировки
- по какой-то причине вы храните номера в столбцах CHAR() или VARCHAR (например, телефоны).
- Почтовые индексы
- UUID,
- и т.д.
Во всех этих случаях вы можете сохранить (немного) бит циклов процессора с двоичной сортировкой.
Ответ 4
С utf8_general_ci совпадения происходят без учета случая и акцентуации. Это может быть хорошо, когда вам нужно выполнять запросы на слова.
В utf8_bin совпадение происходит только тогда, когда строки строго одинаковы. Запросы выполняются быстрее.