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

Ahm*_*xan 5 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
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用 LIKE BINARY,则会出现区分大小写的行为

SUBSTRING(password,1, 3) LIKE BINARY "3VF"   -> returns false
SUBSTRING(password,1, 3) LIKE BINARY "3Vf"   -> returns true
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT * from users where username="natas16" AND SUBSTRING(password,1, 3) = XX
Run Code Online (Sandbox Code Playgroud)

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

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

Mik*_*ant 7

无论LIKE和=行为的情况下敏感的方式将你正在做的比较的字段排序来确定。如果您的字段具有不区分大小写的排序规则(就像我猜您的那样),那么您会得到不区分大小写的比较结果。如果该字段具有二进制或区分大小写的排序规则,或者如果您BINARY在比较中使用关键字强制进行二进制比较,您将获得区分大小写的比较。