Mysqlでは、1 = 1と1 = 1 = 1と-1 = -1と-1 = -1 = -1と5 = 5と5 = 5 = 5の違いは何ですか


      まず、次の質問を検討してください。

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 = 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の値は、5に変更されていると仮定すると、すべて1ですか?
      

+------+------+------+------+------+------+
| 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.予備分析

      最初に宣言します。ログテーブルが処理され、データは1つだけになりました。
      以下は、実行された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)

       上記の2つから、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が返されます。私の考えは正しいようです。

3.まとめ

1.まとめ

       このSQLについて:

select 
	n1
from logs
where n1 = n2 = n3 

       私はいつも思っていました:このsqlでは、n1 = n2およびn2 = n3の影響であるはずですが、実際にはn1 = n2であり、n1 = n2の値がn3と等しいかどうかを確認します。
       上記のいくつかのSQL判定の後、判定条件はtrueまたはfalseに対応する1または0を返します。
       つまり、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)

       私の結論は正しいようです。

4.展開

       上記の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を返します。
       まあ、私の結論は正しいです。()は優先度を上げることができます。

5、投稿

       私はJavaでコードを書き、すべてa == b && b == cと書きましたが、a == b == cとは書きませんでした...
      よく、私の脳は壊れています。javaから、a == bはブール値、booleanを返す必要があります!=特定の数値は通常の動作です
       が、mysqlはtrueまたはfalseではなく1または0を返します。発見ですか?ええと、数えます。

6、ポストの後

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. 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に等しくなります...
      私は長い間自分を動かしたように感じます...ああ...

48件の元の記事を公開 36のような 訪問130,000+

おすすめ

転載: blog.csdn.net/weixin_42845682/article/details/105262892