当社では、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構成に設定がある可能性はありますか? 私はそれで少し立ち往生しています。すべての助けに感謝します!
前もって感謝します...