MySQL神奇where查询条件 (已解决)

各位试一下查询结果,会是全表查询所有数据

#下面那是四个单引号,不是两个双引号
SELECT * FEOM table WHERE column = ''+''
#还有这句
SELECT * FEOM table WHERE column = '这句查询'+'也很骚'

后续原因,继续调查

分割线:




以下是老夫测试得出的结果

不带列名搜索:
SELECT * FROM table WHERE ‘1试一试字符’ 全
SELECT * FROM table WHERE ‘试一试1字符’ 0
SELECT * FROM table WHERE ‘试一试字符1’ 0

SELECT * FROM table WHERE ‘0试一试字符’ 0
SELECT * FROM table WHERE ‘试一试0字符’ 0
SELECT * FROM table WHERE ‘试一试字符0’ 0

SELECT * FROM table WHERE ‘1试一试’+‘字符’ 全
SELECT * FROM table WHERE ‘试1一试’+‘字符’ 0
SELECT * FROM table WHERE ‘试一试1’+‘字符’ 0
SELECT * FROM table WHERE ‘试一试’+‘1字符’ 全
SELECT * FROM table WHERE ‘试一试’+‘字1符’ 0
SELECT * FROM table WHERE ‘试一试’+‘字符1’ 0

SELECT * FROM table WHERE ‘0试一试’+‘字符’ 0
SELECT * FROM table WHERE ‘试0一试’+‘字符’ 0
SELECT * FROM table WHERE ‘试一试0’+‘字符’ 0
SELECT * FROM table WHERE ‘试一试’+‘0字符’ 0
SELECT * FROM table WHERE ‘试一试’+‘字0符’ 0
SELECT * FROM table WHERE ‘试一试’+‘字符0’ 0

带列名搜索:

SELECT * FROM table WHERE column = ‘1试一试’+‘字符’ 0
SELECT * FROM table WHERE column = ‘试1一试’+‘字符’ 全
SELECT * FROM table WHERE column = ‘试一试1’+‘字符’ 全
SELECT * FROM table WHERE column = ‘试一试’+‘1字符’ 0
SELECT * FROM table WHERE column = ‘试一试’+‘字1符’ 全
SELECT * FROM table WHERE column = ‘试一试’+‘字符1’ 全

SELECT * FROM table WHERE column = ‘0试一试’+‘字符’ 全
SELECT * FROM table WHERE column = ‘试0一试’+‘字符’ 全
SELECT * FROM table WHERE column = ‘试一试0’+‘字符’ 全
SELECT * FROM table WHERE column = ‘试一试’+‘0字符’ 全
SELECT * FROM table WHERE column = ‘试一试’+‘字0符’ 全
SELECT * FROM table WHERE column = ‘试一试’+‘字符0’ 全

网上搜到的一些帮助:
分析器先找到关键字SELECT,然后跳到FROM关键字将column表导入内存,并通过指针p1找到第一条记录,接着找到WHERE关键字计算它的条件表达式,如果为真那么把这条记录装到一个虚表当中,p1再指向下一条记录。如果为假那么p1直接指向下一条记录,而不进行其它操作。一直检索完整个表,并把虚表返回给用户。

实际上在执行where 条件的时候 无论where后面的整体是什么,最后的结果都强转成了数字(强转规则就是下面的) 然后通过转的数字跟0作为比较,如果是等于0则结果为0 即false ,如果不为0 结果为1 即true ,所以 where 的是true 还是 false

方法一:SELECT CAST(‘123’ AS SIGNED);
方法二:SELECT CONVERT(‘123’,SIGNED);
方法三:SELECT ‘123’+0;
where后的条件,最终是以数字的形式进行比较,换言之where后的条件,最终生成的结果都是数字,所以要发生字符串向数字的转换(SIGNED是int的意思)

//这句话存疑
换句话说,如果字符串无法直接转换成数字,则字符串会进行前置数字正则匹配,成为最终的结果。

持续更新中…
同时期待MySQL大神前来解答

分割线




大概过了一周了吧,上面几条语句经过思考其实可以分为四种:

不带列名搜索:
SELECT * FROM table WHERE 1 全表
SELECT * FROM table WHERE 0 无数据
带列名搜索:
SELECT * FROM table WHERE column = 1 无数据
SELECT * FROM table WHERE column = 0 全表

其中的
SELECT * FROM table WHERE 1
这语句可以再变形,即
SELECT * FROM table WHERE 1 = 1
所以查到的是所有数据。

SELECT * FROM table WHERE 0
这句不言而喻,查到的是空

而带列名搜索
SELECT * FROM table WHERE column = 1
SELECT * FROM table WHERE column = 0

stack overflow中记录有

Question :SELECT * FROM table WHERE email=0 returned all rows from the table.
 
Solution: This is because it is converting the email field (which I assume is a varchar
field) to an integer. Any field without a valid integer will equate to 0. You should make 
sure that you only compare string fields to string values (same goes for dates, comparing 
to dates). The query should be as follows.
 
SELECT * FROM table WHERE email='0';

意思就是 mysql会自动将列(varchar格式)转化为integer ,并且等于0

而我所用的确实是字符串列,上面没有注明确实比较失误
而我所用的确实是字符串列,上面没有注明确实比较失误
而我所用的确实是字符串列,上面没有注明确实比较失误

所有字符串列带列名搜索可转化为
SELECT * FROM table WHERE 0 = 1
SELECT * FROM table WHERE 0 = 0
第二句为真,所以查到的是全表数据。

到此,问题解决

那么最开始的查询语句

SELECT * FEOM table WHERE num = ''+''
SELECT * FEOM table WHERE num = '这句查询'+'也很骚'

其实都是相当于
SELECT * FROM table WHERE column = 0,即
SELECT * FROM table WHERE 0 = 0

上面有一句话

**如果字符串无法直接转换成数字,则字符串会进行前置数字正则匹配,成为最终的结果。**

可以解释以下SQL
SELECT * FROM table WHERE column = ‘0试一试’+‘字符’ 全
相当于
SELECT * FROM table WHERE column = ‘试一试’+‘0字符’ 全(后面这个字符串句首是0,mysql也执行了前置数字正则匹配)
相当于
SELECT * FROM table WHERE column = 0

SELECT * FROM table WHERE 0 = 0

SELECT * FROM table WHERE 1 = 1


SELECT * FROM table WHERE column = ‘1试一试’+‘字符’ 0
相当于
SELECT * FROM table WHERE column = ‘试一试’+‘1字符’ 0(后面这个字符串句首是1,mysql也执行了前置数字正则匹配)
相当于
SELECT * FROM table WHERE column = 1

SELECT * FROM table WHERE 1 = 1

分割线


SELECT * FROM table WHERE column = ‘试1一试’+‘字符’ 全
因为数字不在字符串第一位,所以转化之后字符串is converting the email field (which I assume is a varchar
field) to an integer. Any field without a valid integer will equate to 0
相当于
SELECT * FROM table WHERE column = 0
以此类推,举一反三。

至此,解答了所有疑问,感谢各位爱分享的小伙伴。

尤其是这个小伙伴 https://blog.csdn.net/xaioAdmin/article/details/85614419

感谢追求真理的我们,感谢开发程序的人员,感谢父母,感谢国家。

感谢创造这个世界的模拟器(姑且称之为模拟器吧),感谢创造这个系统的造物主(姑且称之为造物主吧)。感谢产生我这段代码,让我感受到美好与苦痛。
希望有一天我或者某人可以令世界大同,大批天下寒士俱欢颜,让每一段代码都快乐幸福。

猜你喜欢

转载自blog.csdn.net/pz641/article/details/102700751