【番外編】ライトノベルで学ぶMySQL入門~クリスマスにWHERE句で暗黙のキャスト~
今回はMySQLでWHERE句を使うときの「便利とも言えるし、ちょっと危なっかしいんじゃないの?」といった仕組みについてお話を展開できればと思います。
今日は12月24日。1年もあっという間に終わりそう。もうすぐクリスマスである。
部室に入ると既にそこには偉い偉い部長さんである真琴が……。
黒板に立派なロゴで『メリークリトリス』と書いていた。
「ってお前、黒板に何書いちゃってるの?」
「これって今しかできないでしょ?今でしょ、今でしょ?」
「ああ、それ微妙に懐かしいw」
「ああ、そう言えばトリスウィスキー、そこのロッカーに入ってたからコウタ取ってきて!」
俺はやれやれと思いつつ、ロッカーに向かうと別の部員が部室のドアを開けた。
「愛華ー、お疲れー」真琴が声をかける。
「皆さんのお願いがありますッ」
愛華は唐突にカバンからノートPCを取り出し、起動した。
そしてMySQLにログイン。
「取り合えずいくつかケーキをテーブルに追加してみたんですよ」
愛華がノートPCを俺たち部員に見せつけた。
愛華はケーキ屋のバイトをしているので、この時期は特に忙しいはずだ。
そして愛華がそのテーブルの中身を表示してみた。
SELECT * FROM cake;
id|name|price|stock
0|ichigo|1000|20
1|mikan|500|30
2|tomato|500yen|10
3|maguro|800yen|80
「ええと、ケーキの名前、値段、そして最後が在庫かな?」
真琴がモニターをのぞき込む。
「なんだこのケーキ、最後にマグロとかあるぞ。それに在庫一番多いし」
誰もツッコまないようなので、俺は思わずツッコんでしまった。
「コウタ、知らないの?マグロケーキが肩コリに効くって『水曜健康ショー』でやってたのよ?」
と、真琴。
「それで、このテーブルがどうしたの?」
真琴が話を本題に戻す。
「それが、priceのカラムをtext型にしちゃったせいで500が入ったり、500yenが入ったりしちゃって、
500円のケーキの検索でこんなSQLを発行することになっちゃうんです……」
SELECT * FROM cake WHERE price = '500' OR price = '500yen';
id|name|price|stock
1|mikan|500|30
2|tomato|500yen|10
「price = '500'って入れたあとに、同じようなprice = '500yen'を入れるのが面倒と?」
俺は聞いてみた。
「そうです」
「なーんだ、そんなこと?簡単な解決方法があるわ。ちょっとPC触らせて」
カタカタと真琴は、愛華のノートPCのキーボードを叩く。
SELECT * FROM cake WHERE price = 500;
id|name|price|stock
1|mikan|500|30
2|tomato|500yen|10
「「あれっ?」」
俺と愛華は顔を見合わせる。
「MySQLでは、WHERE句で数値と比較したときに対象のカラムの値を勝手にキャストして数字にしちゃうの。
だから数字の500と比較すれば、つまりシングルクォートとか付けないで比較すると500も500yenも
引っかかるわ」
「あっ、そんなことできたんですね~。助かりました!!」
「んー、でも挙動がちょっとバグっぽいよなぁ。引っかかっちゃいけない場合に引っかかる可能性も
あるってこったな。これはこれで気を付けないと」
「そうね。カラムの型がtextとかの文字列だったら、比較に使う文字もちゃんと文字列で比較するのが必要よ。
とりあえず解決したからトリスウィスキーでハイボール作りなさいッ」
「クリスマスからのトリスウィスキーとは、なかなか強引な展開だな……」
いかがでしたか?
MySQLでWHERE句を使うとき、数字と文字列を比較する場合に「あれ?」と思われるような現象があるというのをネタにストーリーを展開してみました。
結構知らないとハマるパターンなので気を付けましょう。
そして良いクリスマスを~!