tamulab.jp

tamulabはプログラミングのtipsやインターネット上で気になったことなどを書いてます

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

calendar

reload

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

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

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

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

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

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

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

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

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

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

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

この記事をシェアする

関連記事

FuelPHP の ORM\Model での find(‘all’) について

No Image

AWS RDS から EC2 インスタンスに DB を移設

No Image

about

Toru TAMURA

Toru TAMURA

PHP, Ruby などをあやつるWebエンジニアです。Amazon Web Service(AWS)のユーザーグループ JAWS-UG 島根支部所属 [詳細]