MySQLのlikeでの「_」の扱い

2011年5月12日

先ほど、仕事でなぜか違うデータが抽出されるんだけど…という不具合を報告され

よくよく調査したら、

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(/_/, '\_')])

MySQL,SQLMySQL,SQL

Posted by GENDOSU