36
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MySQLの照合順序を修正する

Last updated at Posted at 2016-01-30

##環境
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へ変更する

36
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?