6

我在使用 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

此外,这不是一个真实世界的应用程序,而是一个 natas 级别。这是一个“黑客”游乐场。它们具有不同级别的漏洞,您应该利用这些漏洞。所以这不是一个真实世界的例子。

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

4

2 回答 2

7

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

于 2013-03-19T16:10:01.930 回答
0

阅读 abt collat​​e 选项以及如何从 mysql教程中使其区分大小写

于 2013-03-19T16:11:34.567 回答