記事ディレクトリ
まず、次の質問を検討してください。
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に等しくなります...
私は長い間自分を動かしたように感じます...ああ...