MySQL / MariaDB 不区分大小写的排序规则仍然区分大小写吗?

MySQL / MariaDB Case Insensitive Collation Still Case Sensitive?

使用 MariaDB 10.0.36,我有一个用户 table,其排序规则为 utf8_turkish_ci,其中 user_login 列存储用户的用户名,该用户名也使用 utf8_turkish_ci 具有唯一索引。

我的理解是 select 语句应该不区分大小写,但对于某些用户名似乎不是这样。

例如,我有一个用户登录 GoDoIt

这条语句returns没有记录:

SELECT * FROM user WHERE user_login = 'godoit'

但是,这有效:

SELECT * FROM user WHERE user_login = 'GoDoIt'

我觉得这很奇怪,因为 Eric 的用户名是双向的。

SELECT * FROM user WHERE user_login = 'eric' SELECT * FROM user WHERE user_login = 'Eric'

Return同样的结果。那么为什么字符串中间的大写字母不起作用呢?在将 PHP 中的输入用户名发送到数据库之前,我在字符串上使用 tolower 降低了输入用户名,我想这种方法不适用于某些用户名。

土耳其语不带点的 I 和带点的 i 是两个不同的字符;这些在 utf8_turkish_ci 归类中不被认为是相等的。

在此处查看整理图表:http://collation-charts.org/mysql60/mysql604.utf8_turkish_ci.html

请注意无点 I 和带点 i 的单独条目。

其他背景:https://en.wikipedia.org/wiki/Dotted_and_dotless_I

(评论太长。Spencer 的回答很好。)

This 列出了字母和状态是否相等,以及它们的顺序。这是显示无点 I 彼此相等但被认为小于点 I 的摘录:

utf8_turkish_ci   I=ı  Ħ=ħ  i=Ì=Í=Î=Ï=ì=í=î=ï=Ĩ=ĩ=Ī=ī=Ĭ=ĭ=Į=į=İ  ij=IJ=ij   iz J=j=j́=Ĵ=ĵ  jz

关于 utf8_turkish_ci 的其他一些不寻常的事情:Ö=ö -- 被视为 O 和 P 之间的 "letter"。对于 Ç=ç 和 [=14= 也是如此] 和 Ş=ş

注意:utf8mb4 和 utf8 处理土耳其语的方式相同。

MySQL 6.0 几年前就死在了藤蔓上;看起来 link 的排序规则相对于 Ş:

已经过时
mysql> SELECT 'Ş' = 'S' COLLATE utf8_turkish_ci;
+------------------------------------+
| 'Ş' = 'S' COLLATE utf8_turkish_ci  |
+------------------------------------+
|                                  0 |
+------------------------------------+