Utf8mb4_unicode_ci vs utf8mb4_bin

Итак, сначала посмотрим, правильно ли я прав:

Кодировка - это набор символов и кодировок. Сопоставление - это набор правил для сравнения символов в кодировке.

Я должен использовать utf8mb4, потому что mysql utf8 - это мошенничество, до 3-байтов, а не истинная реальная версия utf8 charset до 4 байтов в PHP, например.

Таким образом, utf8mb4 - это кодировка, а utf8mb4_unicode_ci/utf8mb4_bin - это два из его многочисленных различий в доступных комбинациях.

utf8_unicode_ci делает нечувствительное к регистру сравнение и другие специальные сравнения (я слышал, что это испортит все акценты на французском языке, например). utf8_bin чувствителен к регистру, поскольку он сравнивает двоичные значения символа.

Теперь вопросы:

1. Если, например, я хочу разрешить регистрационные имена Case-Sensitive, используя utf8mb4_unicode_ci, мне придется делать такие вещи, как:

SELECT name FROM table WHERE BINARY name = 'MyNaMEiSFUlloFUPPERCases';

?

2. Если, например, я хочу разрешить поиск без учета регистра с помощью utf8mb4_bin, мне придется делать такие вещи, как:

SELECT name FROM table WHERE LOWER(name) LIKE '%myname%'

?

3. Итак, какой из них лучше? Как насчет плохих вещей, которые я слышу о utf8_unicode_ci и акцентах/других специальных символах?

Спасибо:)

Ответ 1

Вы "все поняли"? Да, кроме того, что я считаю, что французские акценты "правильно" сравниваются в utf8mb4_unicode_520_ci.

Два ваших SELECTs будут работать с полным сканированием таблицы, тем самым будут неэффективными. Причина в том, что вы переопределяете сортировку (для # 1) или скрываете столбец в функции (LOWER, для # 2) или используете главный шаблон (LIKE %...).

Если вы хотите, чтобы он был эффективным, объявите name равным COLLATION utf8mb4_bin и просто WHERE name = ....

Считаете ли вы, что некоторые из этих эквивалентов и порядков являются "неправильными" для французского?

A=a=ª=À=Á=Â=Ã=Ä=Å=à=á=â=ã=ä=å=Ā=ā=Ą=ą  Aa  ae=Æ=æ  az  B=b  C=c=Ç=ç=Ć=ć=Č=č  ch  cz
D=d=Ð=ð=Ď=ď  dz  E=e=È=É=Ê=Ë=è=é=ê=ë=Ē=ē=Ĕ=ĕ=Ė=ė=Ę=ę=Ě=ě  F=f  fz  ƒ  G=g=Ğ=ğ=Ģ=ģ
gz  H=h  hz  I=i=Ì=Í=Î=Ï=ì=í=î=ï=Ī=ī=Į=į=İ  ij=ij  iz  ı  J=j  K=k=Ķ=ķ
L=l=Ĺ=ĺ=Ļ=ļ=Ł=ł  lj=LJ=Lj=lj  ll  lz  M=m  N=n=Ñ=ñ=Ń=ń=Ņ=ņ=Ň=ň  nz
O=o=º=Ò=Ó=Ô=Õ=Ö=Ø=ò=ó=ô=õ=ö=ø  oe=Œ=œ  oz  P=p  Q=q  R=r=Ř=ř  S=s=Ś=ś=Ş=ş=Š=š  sh
ss=ß  sz  T=t=Ť=ť  TM=tm=™  tz  U=u=Ù=Ú=Û=Ü=ù=ú=û=ü=Ū=ū=Ů=ů=Ų=ų  ue  uz  V=v  W=w  X=x
Y=y=Ý=ý=ÿ=Ÿ  yz  Z=z=Ź=ź=Ż=ż=Ž=ž  zh  zz  Þ=þ  µ

Больше совпадений utf8.

"520" (более новая) версия, не обрабатывая Æ, Ð, Ł и Ø как отдельные буквы и, возможно, другие вещи.