読者です 読者をやめる 読者になる 読者になる

NissyBlog

Life goes on.

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