utf8mb4_unicode_ci 与 utf8mb4_bin

Posted

技术标签:

【中文标题】utf8mb4_unicode_ci 与 utf8mb4_bin【英文标题】:utf8mb4_unicode_ci vs utf8mb4_bin 【发布时间】:2016-09-18 18:39:20 【问题描述】:

所以首先让我们看看我是否正确:

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

我应该使用 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 和重音/其他特殊字符的坏话呢?

谢谢你:)

【问题讨论】:

所以要完全控制我想我会坚持二进制然后自定义正则表达式,它的性能有多糟糕? 如果您想要大小写折叠,但需要区分重音,请通过bugs.mysql.com 提出请求。 【参考方案1】:

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

您的两个SELECTs 都将进行全表扫描,因此效率低下。原因是您正在覆盖排序规则(对于 #1)或将列隐藏在函数中(LOWER,对于 #2)或使用前导通配符(LIKE %...)。

如果您希望它高效,请将name 声明为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  Þ=þ  µ

More utf8 collations 。 8.0 and utf8mb4 collations.

“520”(较新)版本不将 ÆÐŁØ 视为单独的“字母”,也许还有其他东西。

【讨论】:

【参考方案2】:

例如,如果我想允许使用 utf8mb4_bin 进行不区分大小写的搜索,我将不得不执行以下操作:

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

【讨论】:

【参考方案3】:

信息

MySQL 8 现在支持 utf8mb4_0900_as_cs 排序规则

900:UNICODE 版本 9 as:重音敏感 cs:区分大小写

如果您不需要重音和区分大小写,请使用 utf8mb4_0900_ai_ci(这是自 MySQL 8.0.1 以来的默认排序规则)

【讨论】:

以上是关于utf8mb4_unicode_ci 与 utf8mb4_bin的主要内容,如果未能解决你的问题,请参考以下文章

排序规则将 utf8mb4_unicode_ci 更改为 utf8mb4_general_ci

utf8mb4_unicode_ci 在 PhpMyAdmin 中选择,但 WordPress 表使用 utf8mb4_unicode_520_ci 排序规则

collat​​ion utf8mb4_unicode_ci 是啥意思

wordpress导入数据错误MySQL返回:#1273 – Unknown collation:’utf8mb4_unicode_ci’

操作“=”的排序规则(utf8mb4_unicode_ci,EXPLICIT)和(utf8_general_ci,COERCIBLE)的非法混合

MySQL 数据库 - 将字符集和排序规则转换为 utf8mb4 和 utf8mb4_unicode_ci?