##環境
Ubuntu14.04
Rails4.2.1
MySQL 5.5
##照合順序(collation)のお話
Rails4.2でも相変わらずDBはMySQL派です。おはぎはつぶあん派です。
MySQLはちゃんと明示しとかないと照合順序が「utf8_unicode_ci」になってしまいます。
つまりWhere句で「ハハ」を検索しても「母」も「パパ」も「婆」も一緒になっちゃうよというお話です。
「utf8_general_ci」にしないといけない。
##最初からちゃんとしなさいよ
こことか
ActiveRecordでデフォルトの照合順序を変更する
こことか
RailsのApplication Templateでmysqlのcollation設定を追加
ActiveRecordの初期値をちゃんと設定しなさいよ、とあります。
##でももうやっちゃったんだけど…
じゃあ、テーブルを削除してやり直してください。
…って訳には簡単にいきませんよね。運用に乗っちゃってたり。
普通はそうですね。
僕もそうでした。なのでSQLコマンドで変更しましょう。
1.Railsアプリのルートでrails dbコマンドでdatabaseに接続
bundle exec rails db
2.該当のテーブルhogetableのカラムの属性を確認
mysql> SHOW FULL COLUMNS FROM hogetable¥G
変更したいカラムhogecolumnの属性が「utf8_unicode_ci」になっている
************************** 3. row ***************************
Field: hogecolumn
Type: text
Collation: utf8_unicode_ci
Null: YES
Key:
Default: NULL
Extra:
Privileges: select,insert,update,references
Comment:
3.utf8_general_ciに変更します
mysql> ALTER TABLE hogetable MODIFY COLUMN hogecolumn TEXT COLLATE 'utf8_general_ci';
ここで注意する点はカラムの型(Type)を変更しない場合でも、指定してあげないとエラーになります。
上のコマンドでは「COLLATE」の前の「TEXT」がこのカラムの型です。VARCHARだったりする人は適宜変えてください。
なので2項で確認したTypeをもう一度設定してあげないとダメです。
4.ちゃんと確認
mysql> SHOW FULL COLUMNS FROM hogetable¥G
*************************** 3. row ***************************
Field: hogecolumn
Type: text
Collation: utf8_general_ci
Null: YES
Key:
Default: NULL
Extra:
Privileges: select,insert,update,references
Comment:
うむ。ちゃんと変更されているな!