Ruby1.9.1(ms-win32)でMySQLは使えるのか
Rails2.2を試すにあたって、データベースはデフォルトのsqlite3でも良いのだが、どうせなら実績の多いMySQLを使いたいなと思って調べてみた。
MySQL用のアダプタは、とみたまさのり氏が開発しており、以下のように二通りの実装が存在している。
それぞれ、Rubyだけで書かれたもの(JDBCで言えばType4 ThinDriver)と、Ruby用拡張ライブラリィとしてCで書かれたものだ。
Cで書かれたものは、基本的には使用する環境でビルドする必要がある。gemを使ってバイナリも取れるが、現在ダウンロードできるバージョン2.7.3はRuby1.8用にビルドされたものであり、恐らくRuby1.9では使用できない。
ビルドはWindows環境では敷居が高いので、まずはRubyで書かれたものをインストールしてみた。導入は非常に簡単で、ダウンロードしたアーカイブを展開後、インストールするだけである。
#ruby ./install.rb
これで、私の環境であれば$RUBY_HOME/lib/ruby/1.9.1/にmysql.rbがコピーされた使えるようになる。
試しに、同梱されているtest.rbを使って、MySQLに接続してみよう。
E:/ruby/ruby-mysql-0.2.6>ruby test.rb connect.............E:/ruby/ruby-mysql-0.2.6/mysql.rb:1019:in `read': Packets out of order : 0<> (RuntimeError) from E:/ruby/ruby-mysql-0.2.6/mysql.rb:444:in `read' from E:/ruby/ruby-mysql-0.2.6/mysql.rb:110:in `real_connect' from E:/ruby/ruby-mysql-0.2.6/mysql.rb:91:in `initialize' from E:/ruby/ruby-mysql-0.2.6/mysql.rb:1085:in `new' from E:/ruby/ruby-mysql-0.2.6/mysql.rb:1085:in `real_connect' from E:/ruby/ruby-mysql-0.2.6/t/00connect.rb:1:in `' from test.rb:23:in `load' from test.rb:23:in `block in ' from test.rb:19:in `each' from test.rb:19:in ` '
予想はしていたけど、Ruby版はやはり駄目のようだ。MySQL4.1以降で認証プロトコルが変更された以降は未対応らしい。
道としては、
・Ruby/MySQLの5.x対応を待つ
・拡張ライブラリィ版の方は自分でビルドしてみる
このどちらかしかないか。