web-dev-qa-db-ja.com

utf8mb4_unicode_ci vs utf8mb4_bin

だから最初に私はそれが正しいかどうか見てみましょう:

文字セットは、シンボルとエンコーディングのセットです。照合とは、文字セット内の文字を比較するための一連の規則です。

Mysql utf8は3バイトまでの詐欺であり、PHPなどの実際の4バイトまでの実際のutf8文字セットではないため、utf8mb4を使用する必要があります。

そのため、utf8mb4は文字セットであり、utf8mb4_unicode_ci/utf8mb4_binは、利用可能なさまざまな照合順序のうちの2つです。

utf8_unicode_ciは、大文字と小文字を区別しない比較やその他の特別な比較を行います(たとえば、フランス語のすべてのアクセントが台無しになると聞きました)。 utf8_binは、文字のバイナリ値を比較するため、大文字と小文字が区別されます。

次の質問:

  1. たとえば、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とアクセント/その他の特殊文字について聞いた悪いことはどうですか?

ありがとうございました :)

30
shrimpdrake

あなたは「物事を正しく」しましたか?はい、フランス語のアクセントがutf8mb4_unicode_520_ciで「正しく」比較されると思うことを除いて。

2つのSELECTsは両方とも完全なテーブルスキャンを行うため、非効率的です。理由は、照合をオーバーライドする(#1の場合)か、関数の列を非表示にする(LOWER、#2の場合)か、先頭のワイルドカードを使用する(LIKE %...)ためです。

効率的にしたい場合は、nameCOLLATION 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」(新しい)バージョン。

12
Rick James