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 不区分大小写的排序规则仍然区分大小写吗?的主要内容,如果未能解决你的问题,请参考以下文章