首先,思考下面几个问题:
select 1=1;
select 1=1=1;
select -1=-1;
select 1=1;
select 5=5;
select 5=5=5;
select 5=5=1;
select 5=1=0;
今天做一道题,很有意思。相关链接在这:我是链接 https://blog.csdn.net/weixin_42845682/article/details/105264355
一、 几种情况
1. 初始情况 1=1=1
首先,有如下一张表:
+
| i1 | n1 | i2 | n2 | i3 | n3 |
+
| 1 | 1 | 2 | 1 | 3 | 1 |
+
我想查出n1=n2=n3的n1的值。
对这张表执行如下sql:
select
n1
from logs
where n1 = n2 = n3
查询结果如下:
2. 其他情况 5=5=5
上面的n1、n2、n3值都为1,假设换成5呢?
+
| i1 | n1 | i2 | n2 | i3 | n3 |
+
| 1 | 5 | 2 | 5 | 3 | 5 |
+
我想查出n1=n2=n3的n1的值。
对这张表执行如下sql:
select
n1
from logs
where n1 = n2 = n3
查询结果如下:
3. 其他情况 -1=-1=-1
假设表是下面这样
+
| i1 | n1 | i2 | n2 | i3 | n3 |
+
| 1 | -1 | 2 | -1 | 3 | -1 |
+
我想查出n1=n2=n3的n1的值。
对这张表执行如下sql:
select
n1
from logs
where n1 = n2 = n3
查询结果如下:
二、 分析一下
1. 正确的sql
首先,如果使用下面的sql,无论n1、n2、n3的值是什么,都能准确的查出来。
select
n1
from logs
where n1 = n2
and n2 = n3
但是我想不通,为什么 n1 = n2 =n3就不对呢?
2. 初步分析
首先声明:logs表已经处理了,现在里面只有一条数据。
下面分别是执行的sql和返回的结果:
mysql> select 1 from logs where 1=1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
mysql> select 1 from logs where 1=1=1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
从上面两条可以看到:1=1或者1=1=1都没问题。
mysql> select 1 from logs where 5=5;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
mysql> select 1 from logs where 5=5=5;
Empty set (0.00 sec)
mysql> select 1 from logs where -1=-1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
mysql> select 1 from logs where -1=-1=-1;
Empty set (0.00 sec)
从上面可以看出来,5=5,-1=-1能查出来;但是5=5=5,-1=-1=-1就查不出来。
3. 继续分析
1). 1=1
下面分别是执行的sql和返回的结果:
mysql> select 1=1;
+-----+
| 1=1 |
+-----+
| 1 |
+-----+
1 row in set (0.00 sec)
mysql> select 1=1=1;
+-------+
| 1=1=1 |
+-------+
| 1 |
+-------+
1 row in set (0.00 sec)
首先,我一直以为,1=1应该返回true,但是返回了1。从这里开始,我有个想法:mysql中的判断条件(类似n1=n2这种),返回的不是true或者false,而是返回的1和0。
可以看到,sql里,1=1的结果是1(假设为i),i=1的结果还是1。
2). 其他情况
mysql> select 5=5;
+-----+
| 5=5 |
+-----+
| 1 |
+-----+
1 row in set (0.00 sec)
mysql> select 5=5=5;
+-------+
| 5=5=5 |
+-------+
| 0 |
+-------+
1 row in set (0.00 sec)
可以看到,sql里,5=5的结果是1(假设为i),i=5的结果变成了0。
mysql> select -1=-1;
+-------+
| -1=-1 |
+-------+
| 1 |
+-------+
1 row in set (0.00 sec)
mysql> select -1=-1=-1;
+----------+
| -1=-1=-1 |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
可以看到,sql里,-1=-1的结果是1(假设为i),i=-1的结果变成了0。
再验证一下:
mysql> select 1!=1;
+------+
| 1!=1 |
+------+
| 0 |
+------+
1 row in set (0.00 sec)
嗯。。。。应该返回false的地方,返回了0。看来我的想法是对的。
三、 结论
1. 结论
关于这条sql:
select
n1
from logs
where n1 = n2 = n3
我一直认为:这个sql中,应该是n1=n2且n2=n3的效果;但实际上,是n1=n2,然后看n1=n2的值是否等于n3。
经过上面的几个sql判断,一个判断条件,返回的是1或者0,对应true或者false。
也就是说,n1=n2,结果只会是1或者0。
2. 验证结论
执行如下sql:
如果这是代码,应该返回false才对。但是如果看上面的结论,1=2返回0,0=0返回1,所以应该返回1才对。看一下执行结果:
mysql> select 1=2=0;
+-------+
| 1=2=0 |
+-------+
| 1 |
+-------+
1 row in set (0.00 sec)
看来我的结论是对的。。。
四、 拓展一下
根据上面的sql,1=2=0返回的是0。那么想想,()应该也生效吧?
mysql> select 1=(2=0);
+---------+
| 1=(2=0) |
+---------+
| 0 |
+---------+
1 row in set (0.00 sec)
先执行2=0,结果是0;0=1,返回0。
再验证一下:
mysql> select 0=(2=0);
+---------+
| 0=(2=0) |
+---------+
| 1 |
+---------+
1 row in set (0.00 sec)
先执行2=0,结果是0;0=0,返回1。
嗯,我的结论是对的,且()可以提高优先级。
五、后传
感谢某大佬指点,我想起来了,我在java里写代码,写的都是a\==b&&b\==c,没写过a\==b\==c....
嗯,脑残了。。。从java来说,a\==b返回的肯定是一个boolean,boolean!=具体的数字是一个很正常的行为...
不过想一想,mysql返回的是1或者0,而不是true或者false,这也算一个发现吧?。。。嗯嗯,算的。。。
六、后后传
1. 第一次验证
mysql返回的1或者0,和true或false是什么关系呢?...
mysql> select 1=true;
+--------+
| 1=true |
+--------+
| 1 |
+--------+
1 row in set (0.00 sec)
mysql> select 1=false;
+---------+
| 1=false |
+---------+
| 0 |
+---------+
1 row in set (0.00 sec)
mysql> select 0=false;
+---------+
| 0=false |
+---------+
| 1 |
+---------+
1 row in set (0.00 sec)
mysql> select 0=true;
+--------+
| 0=true |
+--------+
| 0 |
+--------+
1 row in set (0.00 sec)
2. 第二次验证
嗯。。。这个不算返回值,是我自己定义的1或者0,试试返回值。
mysql> select 1=1;
+-----+
| 1=1 |
+-----+
| 1 |
+-----+
1 row in set (0.00 sec)
mysql> select 1=1=true;
+----------+
| 1=1=true |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)
mysql> select 1=1=false;
+-----------+
| 1=1=false |
+-----------+
| 0 |
+-----------+
1 row in set (0.00 sec)
试一试0的值
mysql> select 1=2;
+-----+
| 1=2 |
+-----+
| 0 |
+-----+
1 row in set (0.00 sec)
mysql> select 1=2=true;
+----------+
| 1=2=true |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
mysql> select 1=2=false;
+-----------+
| 1=2=false |
+-----------+
| 1 |
+-----------+
1 row in set (0.00 sec)
3. 结论
mysql返回的1或者0,以及自己定义的1或者0,基本等于true或者false....
感觉我把自己感动了半天....唉...
评论