我想知道在正常选择操作的情况下,搜索是不区分大小写的。所以SELECT * FROM tbl WHERE name = aBc
也会考虑带有值 ABC、abc、abC 等的名称
但是在登录功能的情况下,我们只是
SELECT * FROM tbl WHERE password = aBc
区分大小写,只考虑带有 aBc 值的密码。
这是怎么发生的?我在搜索中没有找到任何关于此的内容。
请注意解释。
谢谢大家。
我想知道在正常选择操作的情况下,搜索是不区分大小写的。所以SELECT * FROM tbl WHERE name = aBc
也会考虑带有值 ABC、abc、abC 等的名称
但是在登录功能的情况下,我们只是
SELECT * FROM tbl WHERE password = aBc
区分大小写,只考虑带有 aBc 值的密码。
这是怎么发生的?我在搜索中没有找到任何关于此的内容。
请注意解释。
谢谢大家。
我认为这取决于列的排序规则,MySQLutf8_general_ci
中ci
的默认数据库排序规则,最后代表不区分大小写。
MD5
仅当您使用或PASSWORD
函数以加密格式存储密码时,区分大小写的密码才有效。
show variables like '%collation%';
+---------------------------+-------------------+
| Variable_name | Value |
+---------------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | utf8_general_ci |
| collation_server | latin1_swedish_ci |
+---------------------------+-------------------+
$sql="SELECT * FROM user where username='$username' AND BINARY password='$password'";
区分大小写使用 (BINARY)
SELECT * FROM tbl WHERE BINARY密码 = aBc
我不确定您的确切问题的答案是什么,但是如果您将密码作为文本存储在数据库中,那么这是一个非常糟糕的主意。相反,您应该做的是在注册时散列密码并以该形式将其存储在您的数据库中。然后,每次用户尝试登录时,您都会重新散列提交的密码,并将其与存储在具有匹配用户名的行中的散列进行比较。由于哈希区分大小写,这可以解决您的问题,同时增加急需的安全级别。
在许多实现中,密码或其哈希值在应用程序服务器中进行比较,因此不会出现问题。