So first let's see if I get it right:

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

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

因此,utf8mb4是一个字符集,utf8mb4_unicode_ci/utf8mb4_bin是他许多不同的可用排序规则中的两个.

utf8_unicode_ci进行不区分大小写的比较和其他特殊比较(例如,我听说它把法语中的所有口音都弄乱了).utf8_bin区分大小写,因为它比较字符的二进制值.

Now the questions:

  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和口音/其他特殊字符,我听说了哪些不好的事情?

谢谢:)

推荐答案

你"做对了"吗?是的,除了我认为在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 .

"520"(较新)版本没有将ÆÐŁØ作为单独的"字母"处理,或许还有其他东西.

Mysql相关问答推荐

插入时发生日期时间字段溢出错误

从单行中获取最大日期的最佳方法

在MySQL查询中查找和替换表内的值

将 Cloud Function (nodejs) 连接到 CloudSQL mySQL 数据库

我在连接到 mysql 的 node js 中收到错误消息发送到客户端后无法设置标头

MYSQL 8.0 - 从 INFORMATION_SCHEMA.COLUMNS 获取表列重新调整其他不相关的列

为什么一个 10 位的电话号码不能存储在长度为 10 的整数中?

MySQL 1292 截断不正确的日期时间值:'2020-09-11T08:32-50Z'

MySQL 8 - MBRContains 不使用空间索引

用数字和字母对 VARCHAR 列进行排序

使用 ON DUPLICATE KEY 将列增加一定数量 MySQL NodeJS

估计行数 SQL

最好的 MySQL 性能调优工具?

没有 JDBC 类型的方言映射:1111

不是唯一的表/别名

是否可以在内部连接期间重命名连接列?

如何在mysql中连接整数(整数和整数)和varchar(nvarchar和varchar)等数据类型?

MySQL - 如何 Select 值在数组中的行?

MAMP mysql 服务器无法启动.没有mysql进程正在运行

MySQL 中的 VARCHAR(255) 和 TINYTEXT 字符串类型有什么区别?