DataMapper + MySQL でカラムごとに COLLATE を指定する
DataMapper + MySQL ではデフォルトの COLLATE として utf8_general_ci が使われるため、文字列の比較の際は大文字・小文字やアクセント符号が無視されてしまう。大文字・小文字を区別したい場合は utf8_general_ci の代わりに utf8_bin を指定しなければいけないが、DataMapper の仕組みの中ではこれを指定することはできないようだ。
そこで、カラム単位の COLLATE を指定するためのプラグイン(というかモンキーパッチ?)を書いてみた。コードは gist に置いた。*1
使い方はこんな感じ。
class Model include DataMapper::Resource property :text, String, :collate => 'utf8_bin' end
他の DBMS の collation support の様子が分からないので、upstream に送る予定は無し。
他にも、BIGINT 型をサポートする Bigint クラスを作ってみたりしたけど(gist:159375)、この場合は Integer を拡張して size オプションを元に SMALLINT/INT/BIGINT を使い分けられるようにする方が真っ当な方法のような気がするなあ。
*1:gist の embed をはてなで使う方法が無いのが残念。idea:21170 というのがあるけど注目度は低いようだ。 直に <script> で埋め込めた…。