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

Posted

技术标签:

【中文标题】MySQL / MariaDB 不区分大小写的排序规则仍然区分大小写吗?【英文标题】:MySQL / MariaDB Case Insensitive Collation Still Case Sensitive? 【发布时间】:2019-06-19 11:08:18 【问题描述】:

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

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

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

此语句不返回任何记录:

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'

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

【问题讨论】:

这与“案例”无关。 【参考方案1】:

土耳其语 dotless I 和 dotted 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

【讨论】:

天哪...我一直在使用错误的排序规则。【参考方案2】:

(评论太长。斯宾塞的回答很好。)

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

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

utf8_turkish_ci 的其他一些不寻常之处:Ö=ö - 被视为 O 和 P 之间的“字母”。Ç=ç 和 Ğ=ğŞ=ş 也是如此

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

MySQL 6.0 几年前就死了;相对于Ş,排序规则的链接似乎已过期:

mysql> SELECT 'Ş' = 'S' COLLATE utf8_turkish_ci;
+------------------------------------+
| 'Ş' = 'S' COLLATE utf8_turkish_ci  |
+------------------------------------+
|                                  0 |
+------------------------------------+

【讨论】:

以上是关于MySQL / MariaDB 不区分大小写的排序规则仍然区分大小写吗?的主要内容,如果未能解决你的问题,请参考以下文章

mysql查询时不区分大小写

如何设置MySQL中表的大小写区分

Centos7安装Mysql(Mariadb)

mysql 排序规则

MySQL的排序规则

MySQL UTF-8 常用字符排序规则