SQLServerで「〇」が空文字列と一致する件
少し前に不思議な現象をSQLServerで見つけたので記録しておく。「〇」文字をテーブルに登録して検索してみたらおかしいと云われて調べてみた。結果、「〇」ではなく「〇(漢数字)」文字を登録しているためとわかった。
「まる」で日本語変換すると、3つの丸が候補にでる。
無印と、記号と、漢数字の3つ。漢数字の丸をテーブルに登録して、記号の丸でselectしたら、それは見つからない。
不思議なのはここから。
漢数字の「〇」は、なぜか、空文字列と一致するで検索すると見つかる。こういうテーブルを作って、
「文字」が空文字列と等しいレコードをselectしてみると、
なぜか見つかる。
漢数字の「〇」は漢数字の0(零)を意味する文字らしいので、空文字列と等しいとなるらしい。SQLServerでは数値の0は’’と等しいので、それと同じ扱いのようだ。
ということで、テキストの「◯」のつもりで漢数字の「〇」を登録していると、SQLの問い合わせで予期せぬ結果が返ってきて、びっくりすることになるかもしれない。気を付けましょう。
「まる」で日本語変換すると、3つの丸が候補にでる。
無印と、記号と、漢数字の3つ。漢数字の丸をテーブルに登録して、記号の丸でselectしたら、それは見つからない。
不思議なのはここから。
漢数字の「〇」は、なぜか、空文字列と一致するで検索すると見つかる。こういうテーブルを作って、
「文字」が空文字列と等しいレコードをselectしてみると、
SELECT * FROM [aUniCode] where [文字] = ''
なぜか見つかる。
漢数字の「〇」は漢数字の0(零)を意味する文字らしいので、空文字列と等しいとなるらしい。SQLServerでは数値の0は’’と等しいので、それと同じ扱いのようだ。
select case when 0 = '' then 1 end -- 結果は1(これもびっくり) select case when '0' = '' then 1 end -- 結果はNULL select case when '〇' = '' then 1 end -- 結果は1(ちょっとおかしくないかい?)
ということで、テキストの「◯」のつもりで漢数字の「〇」を登録していると、SQLの問い合わせで予期せぬ結果が返ってきて、びっくりすることになるかもしれない。気を付けましょう。
コメント
コメントを投稿