Подтвердить что ты не робот

Какие эффекты имеет использование двоичной сортировки?

Отвечая на этот вопрос, я не понял, что мне не удалось найти достаточный ответ.

Каковы практические различия между использованием двоичных utf8_bin и нечувствительных к регистру utf8_general_ci сопоставлений?

Я вижу три:

  • Оба имеют другой порядок сортировки; _bin порядок сортировки, скорее всего, поместит любые умлауты в конец алфавита, потому что значения байтов сравниваются (справа?)

  • Только чувствительные к регистру поисковые запросы в _bin

  • Нет A = Ä равенство в _bin

Есть ли какие-либо другие отличия или побочные эффекты, о которых нужно знать?

Ссылка:

Аналогичные вопросы, которые не затрагивают проблему:

4b9b3361

Ответ 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 совпадение происходит только тогда, когда строки строго одинаковы. Запросы выполняются быстрее.