MySQL の文字列カラムでの検索でハマった

この記事は公開されてから8年経過しています。現在とは内容が異なる場合がありますのでご注意ください。
最新の記事や関連記事をお探しの方は下の「サイト内検索」で検索してみてください。

結論からさきに書くと文字列型のカラムに 0 という文字の入ったレコードを検索するときは文字列として検索しましょう
ってお話。

VARCHAR なカラムに 数字 又は 空文字、NULL のいずれかが入った次のようなテーブルがあります。

ここで point が 0 の件数だけを取得したくて次のような SELECT を実行します。

あれ?何故か 2 じゃなくて 3 となってしまいました。

なぜでしょうか?COUNT じゃなくてレコードを表示してみましょう。

おや? point カラムが空文字になっているレコードもマッチしてしまいました。

代わりに次のような SELECT だとどうでしょうか。

お、正しく point カラムに 0 と記録されているレコードだけになりました。
COUNT の場合も問題ないです。

文字列型のカラムに空文字が入っている場合に WHERE でエスケープせずに「数字の0」とした場合は、空文字にもマッチするようです。
ちなみにこれが 0 じゃない場合は問題ないみたいです。

というか対象のカラムが文字列型ならちゃんとエスケープした値で検索しろってことですよね。

※参考までに
空文字だけで検索するときちんと空文字のレコードだけになりますし、NULL の場合も IS NULL を使えば NULL のレコードだけになります。