1
それは本当に問題ではないですが、私はすでに答えに苦労して見つけました。 問題は、次のクエリにあります。代わりのマイナス持つMySQLの「 - 」など、さまざまな
delete from <table> where id - 145;
がはっきりタイプミスだっ等しいです。データベースの自動コミットがオンになり、id = 145のものを除いてテーブル内のすべてのエントリが削除されてしまいました。そこで、マイナスが "等しくない"演算子として機能しました。
私は似たような状況のために検索し、MySQLのドキュメントにこの演算子のために見て、私は何かを見つけることができませんでした。
が、これは、このように起こることになっていますか?それは正常かMySQLのバグですか?
これは、 'から削除することを意味します。
145-145 = 0と0は偽です –
うん、はい。今は理にかなっている。大いに感謝する。 –
これは一種の、正常です。
id - 145
は、idが145でなく、where句のようなブール値コンテキストでは0以外の値がtrueと評価されたときに非ゼロに評価されます。出典
2017-06-07 09:43:15 Adder
は、基本的にはゼロ以外の値が
true
と同等になりますselect * from mytable where 3;
を試してみてください。これは多くの言語でも当てはまります。文字列のコピーに使用される
while (*p++ = *q++);
という驚異で私は何度も前にこの現象を見つけました。予想通り出典
2017-06-07 09:46:25
これは完璧です。
は、以下のクエリを考えてみましょう:
あなたがこれらに従うならば、あなたは、任意の数がtruthyと見なされていない0ということを理解することができます。 0は虚偽とみなされます。したがって、また:
これらのクエリはすべて表のすべてを削除します。
今質問では、
id - 145
でした。これは、ID 145を持つ行を除いて、行ごとに非ゼロを返しますという理由だけで145から145 =なぜすべてがID 145出典
2017-06-07 09:48:47
多かれ少なかれ。それは文字列に対しても同じ動作をしません。
WHERE
句の内容は条件です。documentation ofDELETE
は、次のように説明しています。リンクされたページは言う:
WHERE
表現でid - 145
は有効な数値式です。さまざまな(整数)数値に評価されます。WHERE
の条件として使用すると、その値はboolean
に変換されます。セクション12.3.3 Logical Operatorsは言う:
、表現
id - 145
は、あなたの質問に答えるために(WHERE
条件FEでの)論理的な観点でTRUE
として扱われ、非ゼロ、非NULL
整数に評価されます。はい、それはこのように起こるはずです。これはMySQLのバグではなく、クエリのバグです(このようにしたい場合は入力ミス)。
出典
2017-06-07 09:52:06 axiac
これはタイプミスでした。私は 'where id = 145'と書いていました。ありがとうございました。 –
関連する問題