You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么MySQL中MyColumn=''=''的WHERE子句会返回所有行

语法不报错的原因

MySQL、MariaDB的比较运算符=遵循左结合规则,同优先级运算符会从左到右依次运算,因此MyColumn=''=''不会被判定为语法错误,会被解析为等价的(MyColumn = '') = ''表达式。

返回全表数据的原因

整个表达式的计算逻辑结合MySQL的隐式类型转换规则,对绝大多数行都会返回真值:

  • 首先运算左半部分MyColumn = '':布尔比较的结果在MySQL中会以数字形式返回,匹配成功返回1(对应TRUE),匹配失败返回0(对应FALSE)。
  • 再将第一步得到的数字结果和空字符串''做等于比较:MySQL跨类型比较时会触发隐式转换,空字符串''转换为数字的结果为0:
    • 若MyColumn的值不为空,第一步结果为0,0 = 0的结果为1(TRUE),该行会被返回。
    • 若MyColumn的值为空,第一步结果为1,1 = 0的结果为0(FALSE),该行不会被返回。

你观测到返回全表,通常是因为测试表的MyColumn字段没有存储空字符串的行,所有行的表达式运算结果都为真,因此被全部返回。

这种写法是常见的SQL注入闭合手段,当业务代码直接拼接用户输入构造SQL时,攻击者仅需输入'=''就能拼接出接近恒真的WHERE条件,绕开身份校验批量拉取数据。

内容的提问来源于stack exchange,提问作者Xel Naga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:54:01