文章目錄
首先,思考下面幾個問題:
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…
感覺我把自己感動了半天…唉…