SQL = vs LIKE vs LIKE BINARY,不区分大小写

时间:2013-03-19 16:05:59

标签: mysql sql database

我在SQL LIKE,=和LIKE BINARY

中遇到了相当奇怪的行为

注意:密码的前3个字符实际上是3Vf,其余查询在语法上也是正确的。

SUBSTRING(password,1, 3) = "3VF"      -> returns true
SUBSTRING(password,1, 3) = "3Vf"      -> returns true

SUBSTRING(password,1, 3) LIKE "3VF"   -> returns true
SUBSTRING(password,1, 3) LIKE "3Vf"   -> returns true

但是如果我使用LIKE BINARY,我会得到区分大小写的行为

SUBSTRING(password,1, 3) LIKE BINARY "3VF"   -> returns false
SUBSTRING(password,1, 3) LIKE BINARY "3Vf"   -> returns true

我不明白为什么比较不区分大小写。考虑密码是VARCHAR(64)。在我在网上看到的所有资源中,它表示=和LIKE都是区分大小写的。

注意:我正在运行的完整查询是

SELECT * from users where username="natas16" AND SUBSTRING(password,1, 3) = XX

此外,这是 NOT 一个真实世界的应用程序,但是natas级别。这有点像黑客攻击'操场。它们具有不同级别的漏洞,您应该利用它们。所以这不是一个现实世界的例子。

http://www.overthewire.org/wargames/natas/

2 个答案:

答案 0 :(得分:4)

LIKE=是否以区分大小写的方式执行操作将取决于您正在进行比较的字段的整理。如果您的字段具有非区分大小写的排序规则(就像我猜你的那样),那么您将得到不区分大小写的比较结果。如果字段具有二进制或区分大小写的排序规则,或者如果您在比较中使用BINARY关键字来强制进行二进制比较,则会得到区分大小写的比较。

答案 1 :(得分:0)

了解collat​​e选项以及如何使其与mysql tutorial

区分大小写