写点什么

Mysql 中,1=1 和 1=1=1 和 -1=-1 和 -1=-1=-1 和 5=5 和 5=5=5 有什么区别

用户头像
Geek_de9857
关注
发布于: 2020 年 12 月 18 日

首先,思考下面几个问题:

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



查询结果如下:



+------+
| n1 |
+------+
| 1 |
+------+

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



查询结果如下:



Empty set (0.00 sec)

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



查询结果如下:



Empty set (0.00 sec)



二、 分析一下

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:



select 1=2=0;

如果这是代码,应该返回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....

感觉我把自己感动了半天....唉...



发布于: 2020 年 12 月 18 日阅读数: 16
用户头像

Geek_de9857

关注

还未添加个人签名 2020.12.17 加入

专注于代码编写中的具体问题和解决方案,想进大厂

评论

发布
暂无评论
Mysql中,1=1和 1=1=1 和 -1=-1 和 -1=-1=-1 和 5=5 和 5=5=5  有什么区别