使用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中的输入用户名,然后再将其发送到数据库,而且我猜想这种方法不适用于某些用户名。
答案 0 :(得分:2)
土耳其无点I和点缀i是两个单独的字符;在utf8_turkish_ci
归类中,那些被认为不相等。
在此处查看整理表:http://collation-charts.org/mysql60/mysql604.utf8_turkish_ci.html
请注意无点I和点分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早在葡萄藤上就死了;似乎该整理链接相对于Ş=ş
已过期:
Ş