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 的单独条目。
(评论太长。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 |
+------------------------------------+
使用 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 的单独条目。
(评论太长。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 |
+------------------------------------+