赞
踩
最近,笔者在开发 Flea Auth 模块的过程中,准备验证以注册的账号huazie进行登录的场景,结果以HUAZIE成功登录,而数据库中存储的账号是huazie。
简单分析了代码,发现了MySQL查询语句出现如下的现象:
上述数据库里 account_code
是小写,不论我们的查询语句中的 account_code
查询条件是大写还是小写,都是可以查出来的。
下面,我们再来试一下数据库里 account_code
是大写的场景:
如上数据库里 account_code
是大写,不论我们的查询语句中的 account_code
查询条件是大小写混合还是小写还是大写,也都是可以查出来的。
显然,不管 account_code
字段在查询语句里值的大小写如何,都可以查询到数据库的数据。
这就引出了 MySQL 查询不区分大小写的问题
我们首先来看下 flea-auth
授权模块下用户表中 account_code
字段的设计:
通过查询 MySQL中文文档–MySQL中的字符集和校对 ,在文章的最后,可知看到如下的内容:
校对规则一般有这些特征:
两个不同的字符集不能有相同的校对规则。
每个字符集有一个默认校对规则。例如,latin1
默认校对规则是 latin1_swedish_ci
。
存在校对规则命名约定:它们以其相关的字符集名开始,通常包括一个语言名,并且以_ci
(大小写不敏感)、_cs
(大小写敏感)或 _bin
(二元)结束。
恍然大悟,醍醐灌顶,我们上述采用用户表的 排序规则 为 utf8_general_ci
,其中 ci
就表示 大小写不敏感。
好了,既然原因已经了解到了,那么就可以开始着手解决了。
感兴趣的朋友可以继续了解 MySQL中文文档–第10章:字符集支持。
下面,我们来尝试修改下 account_code
字段的排序规则,如下所示:
现在我们再来运行一下查询语句试下效果:
由上图可知,目前 MySQL
的查询已经区分大小写了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。