MySQL / MariaDB不区分大小写的排序规则是否区分大小写?

时间:2019-01-25 15:26:48

标签: mysql mariadb collation lowercase

使用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中的输入用户名,然后再将其发送到数据库,而且我猜想这种方法不适用于某些用户名。

2 个答案:

答案 0 :(得分:2)

土耳其无点I和点缀i是两个单独的字符;在utf8_turkish_ci归类中,那些被认为不相等。

enter image description here

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

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

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

答案 1 :(得分:0)

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

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

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

关于utf8_turkish_ciÖ=ö的一些其他异常之处-视为介于O和P之间的“字母”。对于Ç=ç和Ğ=ğ和{{ 1}}

注意:utf8mb4和utf8的土耳其语用法相同。

MySQL 6.0早在葡萄藤上就死了;似乎该整理链接相对于Ş=ş已过期:

Ş