MySQLのlikeでの「_」の扱い
先ほど、仕事でなぜか違うデータが抽出されるんだけど…という不具合を報告され
よくよく調査したら、
code like '2001_1001_202_%'
という条件を見つけた。
前任者は、2001_1001_202_100とか、2001_1001_202_の後にコードが付いたデータを抽出したかったのであろうが
この条件だと2001_1001_2023というデータもヒットしてしまう。
これは、likeでは「_」は任意の一文字を意味する記号であるからである。
仕方が無いので、検索条件として使うコードの「_」をエスケープすることで解決した。
Ruby on Railsでの書き方
find(:all, :conditions => ['code like ?', code.gsub(/_/, '\_')])