Sequel + Ruby/MySQL

最初に結論。Sequel で Ruby/MySQL を使いたい場合は、オプションで :compress => false をつければOK。

以下、経緯。
Ruby 1.9.2 で Sequel を使ってみたら DB から取得した文字列のエンコーディングが全部 ASCII-8BIT だったので、ソースを読んでみたところ、MySQL/Ruby(libmysqlclient を使ってる方) の問題らしいことが分かり、代わりに Ruby/MySQL(pure Ruby 実装の方)を使おうとしたらこれが全く動かなくてハマってしまった。
さらに調べてみたところ、以下のことが分かった。

  • Sequel の MySQL アダプターはデフォルトで圧縮プロトコル (Mysql::CLIENT_COMPRESS オプションを使おうとする。
  • Ruby/MySQL は圧縮プロトコルには対応していない。
  • にも関わらず、接続時オプションで渡された CLIENT_COMPRESS をそのまま MySQL サーバに渡してしまうので、MySQL サーバは圧縮プロトコルで通信をしようとする。
  • クエリー実行時にエラーが起きる。

圧縮プロトコルに対応していないのは仕方がないとしても、接続時に CLIENT_COMPRESS が指定されてた場合は例外を投げるようにすればハマりも最小限に出来そうなので、Issue Tracker に報告してみた。
http://github.com/tmtm/ruby-mysql/issues/#issue/9
まあ、エンドユーザーとしては、最初に書いたように Sequel でオプションを付ければ大丈夫。