Rails の Migration で MySQL の文字列型に BINARY 属性をつけるには

MySQL の文字列型が大文字と小文字を区別してくれない事をつい忘れてしまい、時々問題になるので備忘録を兼ねて。

前述の通り MySQL では char や varchar さらに text 型と言った文字列型で大文字と小文字が区別されません。これを回避するにはカラムの作成時に

ALTER TABLE hoge ADD fuga varchar (255) BINARY;

のように BINARY 属性を指定するか、検索時に SQL

SELECT * FROM hoge WHERE BINARY fuga = 'piyo';

と指定する二つの方法があります(厳密に言うと、検索時の指定方法は他にもありますが)。ただし、検索時に BINARY 属性を指定するとインデックスの利用方法などが変化してしまい、大体の場合においてパフォーマンスが低下するようなので、できるだけテーブルの作成時に必要なカラムには BINARY 属性を指定しておいた方が無難なようです。

そこで Rails の Migration ではカラムの作成時に BINARY 属性を指定できるのかと思って調べたのですが、通常列の追加に用いる add_column メソッドではそうしたオプションは指定できない模様。仕方が無いので、以下のように execute メソッドを直接叩いて自分で指定します。

execute("ALTER TABLE hoge ADD fuga varchar (255) BINARY;")

マイグレーションの巻き戻し時にも自分でカラムを削除するよう指定しないといけないので、マイグレーションを change メソッドでまとめる事もできません。従来型の up と down メソッドに分離して、カラムの削除を別途記述してください。