首先让我们看看我是否做对了:
字符集是一组符号和编码。排序规则是用于比较字符集中字符的一组规则。
我应该使用 utf8mb4,因为 mysql utf8 是一种欺诈,最多 3 字节,而不是 PHP 中真正的最多 4 字节真正的 utf8 字符集。
因此,utf8mb4 是一个字符集,utf8mb4_unicode_ci/utf8mb4_bin 是他许多不同的可用排序规则中的 2 个。
utf8_unicode_ci 进行不区分大小写的比较和其他特殊比较(例如,我听说它会混淆法语中的所有口音)。 utf8_bin 区分大小写,因为它比较字符的二进制值。
现在的问题是:
-
例如,如果我想允许使用 utf8mb4_unicode_ci 区分大小写的登录名,我将不得不执行以下操作:
SELECT name FROM table WHERE BINARY name = 'MyNaMEiSFUlloFUPPERCases';
-
例如,如果我想允许使用 utf8mb4_bin 进行不区分大小写的搜索,我将不得不执行以下操作:
SELECT name FROM table WHERE LOWER(name) LIKE '%myname%'
那么哪一个更好呢?我听到的有关 utf8_unicode_ci 和重音符号/其他特殊字符的坏消息怎么样?
谢谢 :)
你“把事情做好”了吗?是的,除了我认为在 utf8mb4_unicode_520_ci 中比较法国口音是“正确的”。
你的两个SELECTs
都会进行全表扫描,从而效率低下。原因是您正在覆盖排序规则(对于 #1)或隐藏函数中的列(LOWER
,对于#2)或使用前导通配符(LIKE %...
).
如果你想让它高效,声明name
to be 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 排序规则 http://mysql.rjweb.org/utf8_collations.html .
8.0 和 utf8mb4 排序规则 http://mysql.rjweb.org/utf8mb4_collations.html .
“520”(较新)版本不处理Æ
, Ð
, Ł
, and Ø
作为一个单独的“字母”,也许还有其他东西。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)