web-dev-qa-db-fra.com

utf8mb4_unicode_ci vs utf8mb4_bin

Alors, voyons d'abord si je comprends bien:

Un jeu de caractères est un ensemble de symboles et d'encodages. Un classement est un ensemble de règles permettant de comparer des caractères dans un jeu de caractères.

Je devrais utiliser utf8mb4 parce que mysql utf8 est une fraude, jusqu'à 3 octets et non le vrai jeu de caractères utf8 réel jusqu'à 4 octets dans PHP par exemple.

En tant que tel, utf8mb4 est un jeu de caractères et utf8mb4_unicode_ci/utf8mb4_bin sont 2 de ses nombreux classements disponibles.

utf8_unicode_ci fait une comparaison insensible à la casse et d'autres comparaisons spéciales (j'ai entendu dire qu'il gâchait tous les accents en français par exemple). utf8_bin est sensible à la casse car il compare les valeurs binaires du caractère.

Maintenant les questions:

  1. Si, par exemple, je veux autoriser les noms de connexion sensibles à la casse en utilisant utf8mb4_unicode_ci, je devrai faire des choses comme:

    SELECT name FROM table WHERE BINARY name = 'MyNaMEiSFUlloFUPPERCases';
    
  2. Si, par exemple, je veux autoriser la recherche insensible à la casse en utilisant utf8mb4_bin, je devrai faire des choses comme:

    SELECT name FROM table WHERE LOWER(name) LIKE '%myname%'
    
  3. Alors quel est le meilleur ? Qu'en est-il des mauvaises choses que j'entends sur utf8_unicode_ci et les accents/autres caractères spéciaux?

Je vous remercie :)

30
shrimpdrake

Avez-vous "bien fait les choses"? Oui, sauf que je pense que les accents français sont "correctement" comparés dans utf8mb4_unicode_520_ci.

Vos deux SELECTs feront tous les deux une analyse complète de la table et seront donc inefficaces. La raison en est que vous remplacez le classement (pour # 1) ou cachez la colonne dans une fonction (LOWER, pour # 2) ou utilisez un caractère générique de début (LIKE %...).

Si vous voulez qu'il soit efficace, déclarez name comme COLLATION utf8mb4_bin et faites simplement WHERE name = ....

Pensez-vous que certaines de ces équivalences et commandes sont "incorrectes" pour le français?

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  Þ=þ  µ

Plus de classements utf8 .

La version "520" (plus récente) en ne traitant pas Æ, Ð, Ł, et Ø en tant que "lettres" distinctes, et peut-être d'autres choses.

12
Rick James