2

当社では、Web アプリケーション (LAMP) をあるサーバー (Ubuntu 10.04) から新しいサーバー (Ubuntu 12.04.2) に移動しました。これまでに見たことのない奇妙な動作に遭遇し、どこから始めればよいのか本当にわかりません。多分誰かが私にヒントを与えることができます。

次の簡単な表があります。

id      data1       data2       data3
(int)   (varchar)   (int)       (int)
-------------------------------------
1       (empty)     123         456
2       (null)      321         654
3       abc         555         666

(空) は、フィールドに空の文字列が含まれていることを意味します。(null) は、フィールドが null であることを意味します。ここで、次の非常に単純なクエリを使用します。

SELECT * FROM `table` WHERE `data1` != 'abc';

!='abc'私たちの古いサーバーでは、クエリは ID 1 と 2 の行を返しましたが、これら 2 つのレコードセットに一致するため、これは完全に正しいと思います。

新しいサーバーでは、クエリは ID 1 のレコードセットのみを返します。選択フィールドに null を含むレコードセットは、何らかの形でクエリによって突然無視されます。

より明確にするためにIS NULL、使用できることはわかっていますが、この状況に一致するアプリケーション内のすべてのクエリとテーブルをチェックすることになります。

質問は次のとおりです。

古いサーバーで、クエリが 1 行目と 2 行目を返すことで期待どおりに動作したか、それとも新しいサーバーが 1 行目のみを返すことで正しく動作したか?

一般的に:!='abc'レコードセット 1 と 2 に一致する必要がありますか、それとも ID 1 のみに一致する必要がありますか?

その動作を制御するmysql構成に設定がある可能性はありますか? 私はそれで少し立ち往生しています。すべての助けに感謝します!

前もって感謝します...

4

2 に答える 2