utf8mb4_unicode_ci vs utf8mb4_bin

shr*_*ake 34 php mysql utf-8 character-encoding

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

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

因为MySQL UTF8是一个骗局,先进的3个字节,而不是真正的先进的4字节实UTF8 PHP中的字符集,例如我应该使用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';
    
    Run Code Online (Sandbox Code Playgroud)
  2. 例如,如果我想使用utf8mb4_bin允许不区分大小写的搜索,我将不得不这样做:

    SELECT name FROM table WHERE LOWER(name) LIKE '%myname%'
    
    Run Code Online (Sandbox Code Playgroud)
  3. 哪一个更好?关于utf8_unicode_ci和口音/其他特殊字符我听到的坏事怎么样?

谢谢 :)

Ric*_*mes 12

你做得对吗?是的,除了我认为法语口音在utf8mb4_unicode_520_ci中"正确"比较.

你的两个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=?  iz  ?  J=j  K=k=?=?
L=l=?=?=?=?=?=?  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  Þ=þ  µ
Run Code Online (Sandbox Code Playgroud)

更多utf8整理.

在"520"(更新)由未治疗的版本Æ,Ð,?,并Ø作为一个独立的"字母",也许还有其他的事情.