utf8mb4_unicode_ci与utf8mb4_bin

2022-08-30 10:46:34

因此,首先让我们看看我是否做对了:

字符集是一组符号和编码。排序规则是一组用于比较字符集中字符的规则。

我应该使用utf8mb4,因为mysql utf8是一个欺诈,最多3个字节,而不是PHP中真正的4字节真正的utf8字符集。

因此,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口音/其他特殊字符的坏事怎么办?

谢谢:)


答案 1

你“把事情做对了”吗?是的,除了我认为法国口音在utf8mb4_unicode_520_ci中是“正确”的比较。

你们俩都会进行全表扫描,从而效率低下。原因是您正在重写排序规则(对于 #1)或将列隐藏在函数中(对于 #2),或者使用前导通配符 ()。SELECTsLOWERLIKE %...

如果您希望它高效,请声明为并简单地执行。nameCOLLATION utf8mb4_binWHERE 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 归类 .8.0 和 utf8mb4 排序规则

“520”(较新)版本通过不处理, , 和 , 和 作为一个单独的 “字母”, 也许还有其他东西。ÆÐŁØ


答案 2

例如,如果我想允许使用utf8mb4_bin进行不区分大小写的搜索,我将不得不做这样的事情:

请记住,如果您使用它,它将忽略索引LOWER


推荐