Rails
MySQL
ActiveRecord

MySQLの照合順序を修正する

More than 3 years have passed since last update.


環境

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:

うむ。ちゃんと変更されているな!


参考

照合順序をutf8_general_ciからutf8_unicode_ciへ変更する