Какие эффекты имеет использование двоичного сопоставления? - PullRequest
43 голосов
/ 03 апреля 2011

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

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

Я вижу три:

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

  2. Поиск только с учетом регистра в _bin

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

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

Справка:

Подобные вопросы, которые не решают проблему:

Ответы [ 4 ]

51 голосов
/ 04 апреля 2011

Двоичные параметры сортировки сравнивают вашу строку точно так же, как это делает strcmp () в C, если символы отличаются (будь то просто регистр или различие диакритических знаков).Недостатком является то, что порядок сортировки не является естественным.

Примером неестественного порядка сортировки (как в «двоичном» является): A, B, a, b Естественный порядок сортировки будет в этом случае, например:A, a, B, b (маленькие и заглавные варианты буквы смэ расположены рядом друг с другом)

Практическое преимущество двоичного сопоставления - это его скорость, поскольку сравнение строк очень простое / быстрое.В общем случае индексы с двоичными данными могут не давать ожидаемых результатов для сортировки, однако для точных совпадений они могут быть полезны.

12 голосов
/ 05 мая 2011

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

1 голос
/ 07 мая 2011

Другие ответы хорошо объясняют различия.

Двоичные параметры сортировки могут быть полезны в некоторых случаях:

  • столбец содержит шестнадцатеричные данные, такие как хэши паролей
  • вас интересуют только точные совпадения, а не сортировка
  • для идентификаторов только с [a-z0-9_] символами, вы даже можете использовать его для сортировки
  • по какой-то причине вы храните числа в столбцах CHAR () или VARCHAR (например, телефоны)
  • * 1014 Почтовые индексы *
  • UUID,
  • и т.д.

Во всех этих случаях вы можете сохранить (маленький) бит циклов процессора с двоичным сопоставлением.

0 голосов
/ 05 мая 2011

При utf8_general_ci совпадения происходят без учета регистра и акцентуации. Это может быть хорошо, когда вам нужно выполнять запросы к словам.

В utf8_bin совпадение происходит только тогда, когда строки строго совпадают. В этом случае запросы выполняются быстрее.

...