【问题标题】:MySQL / MariaDB Case Insensitive Collation Still Case Sensitive?MySQL / MariaDB 不区分大小写的排序规则仍然区分大小写吗?
【发布时间】: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 中的输入用户名,我猜这种方法不适用于某些用户名。

【问题讨论】:

  • 这与“案例”无关。

标签: mysql mariadb collation lowercase


【解决方案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 |
+------------------------------------+

【讨论】:

    猜你喜欢
    • 2011-06-01
    • 2011-05-23
    • 2011-03-18
    • 2014-05-10
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2012-01-12
    • 2016-12-19
    相关资源
    最近更新 更多