Railsが使ってるMySQLから小文字だけ取ることが出来なくて調べたこと
訳有って、Railsで書かれたアプリケーションのDBに格納されている内容を調査する機会がありました。
ちなみにDBはMySQLです。
今回、調査の為にこんなSQLを実行しました
select * from hoge where hugahuga like '%ィ%';
事情は割愛しますが「ィ」を探すことが目的でした。
しかし、出てきた結果はこのような内容でした。
mysql> select * from hoge where hugahuga like '%ィ%'\G *************************** 1. row *************************** hogehoge: 1 hugahuga: イ *************************** 2. row *************************** hogehoge: 2 hugahuga: ィ 2 row in set (0.00 sec)
簡易的に書きましたが要するに、
mysqlのwhere句に like '%ィ%' って入れたのに「 イ」を含む文字列が出て来てしまったのです。
調べてみた
調べてみたところ、db/schema.rbに以下のような記述が見つかりました。
COLLATE=utf8_unicode_ci
どうやらActiveRecordでは明示的に照合順序を指定しない場合
utf8_unicode_ciのデータベースが作成されるらしく、
select文を投げても大文字と小文字が区別されていなかったようでした。
対処法
BINARY比較をするようにselect文を書き換えました。
書き換えて実行した結果がこちらになります。
mysql> select * from hoge where binary hugahuga like '%ィ%'\G *************************** 1. row *************************** hogehoge: 2 hugahuga: ィ 1 row in set (0.00 sec)
無事、小文字を含むレコードだけ取得出来ました。
参考
utf8_unicode_ci に対する日本の開発者の見解 - かみぽわーる
ActiveRecordでデフォルトの照合順序を変更する - Qiita
MySQLで文字列の検索をCase Sensitiveにするには? - QA@IT