このところPASSJのメーリングリストでお世話になっていたのですが、どうやら標記のことはANSI SQL-92の規格とのことです。でも、どうしてこんな規格に決まったんでしょうね?
標記のことをもう少し詳しく書くと、以下の例のようになります。
nvarchar(10)であるカラムhogeがあるとします。
hogeが''(空文字)とhogeが' '(空白文字一つ)の全部で2つのレコードが
あるとします。
この時、
select count(*) from hogeTable where hoge = ''
とすると、結果は2になります。
また、
select count(*) from hogeTable where hoge = ' '
としても、結果は2になります。
ちなみに、上の例ではhogeが空白文字一つの例ですが、空白文字が何文字あっても同じ結果になります。どうやら空白文字は空文字にみなされて検索されているようです。
対策としては、
1.hogeをnullでクリアする。
2.where句において、データ長で比較する。DATALENTGH(hoge) = DATALENGTH(@hoge)
3.where句において、hoge <> '' を追加する。
4.アプリケーション側で、hogeをtrimし、空文字になったら入力エラーとする。
5.where句において、hoge is not null を追加する。
ぐらいしておくと、不正にデータが引き出されることは無いと思います。最後の5.は、ちょっと主題から外れますが、nullのデータが引き出されることもありえないので付けています。
#PASSJのメーリングリストではお世話になりました。ありがとうございました。