Rubyでmysqlに死闘して接続して表示するやり方

Rubyistからすれば簡単なんでしょうけど・・・・・・・・・・これがまたえらく苦労したのでw
こんなことに1日使ってしまった!
Ruby 1.8
Ruby/mysql 0.2.6 mysql4.1以降対応パッチ当て

追記:このRuby/mysqlは微妙に安定度が低いようなので、手軽さよりも安定命の方はネイティブで書かれているmysql/rubyのほうを使ったほうがいいようですな

接続脱出編

Ruby/mysql」というモジュールがあるようなので、こいつで接続する
http://www.tmtm.org/ruby/mysql/
ここからとってきてRubyのインストールされているlib下あたりにぶち込む
私は、「One-Click Installer - Windowshttp://rubyforge.org/projects/rubyinstaller/ で入れたので、C:\ruby\lib\ruby\1.8\
ここらへんに入れた。説明によると

mysql4.1以降はパスワードの形式が変わったからパッチを当てないと動きませんよ

↑誰の引用w とのことなので、同じ場所に落ちていたパッチを当てる
パッチが当たらない!
パッチファイルのパッチを当てる対象が mysql4.rb だったので mysql.rb に書き換えて実行
終了

さてさて準備完了、サンプルコードがあったので接続してみます

require "mysql"
my = Mysql::new("localhost", "root", "hoge", "hogedb")

実行できた。じゃあSQLいってみるか

res = my.query("select * from hoge_tbl")
res.each do |col|
  col1 = col[0]
  col2 = col[1]
  
  puts col1
  puts col2
end

はい繋がりません!こんなエラーでた

#3D000No database selected

DB選べよ、ボケナスと言われているようです

my = Mysql::new("localhost", "root", "hoge", "hogedb")

最後でちゃんと選んでますが・・・何か? といいたいところだけどダメらしいので、
ハイ選ばさせていただきます!

my.query("use hogedb")

さてさて、これで選んだから実行
実行したけど・・・ダメダメ・・・今度はメソッドへの引数がおかしいよ、と

エラーが出ているのはmysql.rbの550行目あたりのパスワード認証用のダイジェストを生成している部分
これって標準のやつを標準で使ってるんじゃないのかね? なんでエラーなのか
このDigestというモジュールを単体でいじってみたところなんだかコンストラクタで文字列渡すとエラー出ちゃうようで・・・・でもリファレンスには思いっきり・・・

Digest::SHA1.new([str])

って書いてあるし

でもエラー出るし・・・エラー出てるのネット調べても俺だけみたいだし・・・なんだか不安になってきたが、もう知らんということで、よくわからん解決法に走りましたw

      #s1 = Digest::SHA1.new(password).digest
      #s2 = Digest::SHA1.new(s1).digest
      #x = Digest::SHA1.new(message + s2).digest
      objDigest = Digest::SHA1.new()
      s1 = objDigest.digest(password)
      s2 = objDigest.digest(s1)
      x = objDigest.digest(message + s2)

mysql.rbの550行目を書き換えました。 一応等価でしょw オープンはこれだからいいね。こんなんでいいの?w いいか!

さてさてついに実行です。ドーン!

require "mysql"

my = Mysql::new("localhost", "root", "hoge", "hogedb")
my.query("use hogedb")

res = my.query("select * from hoge_tbl")
res.each do |col|
  col1 = col[0]
  col2 = col[1]
  
  puts col1
  puts col2
end

結果

1
???
2
?????
3
??????

なんか出た。文字化けってますw

文字化け炎上編

ははーん、こいつはmysql5に有りげな文字化け問題ですかと・・・しかし、その問題は前から知ってましてDBはすべてUTF8で構成してたんですね〜ここらへんって自動とかでやってくれないのね・・・

いろいろ設定しろやなにやら書いてあるページを眺めましたけど面倒なので次の一行で済ます

my.query("set character set utf8")

よしよしよし。実行!

1
邂。逅・€
2
邂。逅・€
3
荳€闊ャ繝ヲ繝シ繧カ

え・・・邂逅w 思いがけない出会い! 思いがけない化け化け!これってWindowsのコンソールがSJISしか表示できないからこうなってるのか。じゃ変換してやればいいのかね

require "kconv"
・・・
puts Kconv.tosjis(col2)

こんなんでいいのか・・・ドン!

1
ホゲ
2
ホゲ
3
モゲ
※実際のデータと違います

出た!バンザーイ!

さらりと書いてますけど、この間0.1秒ではなく、この間4時間ぐらいかかってますw まだ勝手がわかりません、ダメダメですね。

ってか、もしかしてRubyって文字列型って無かったりして、って思ってきた。文字列操作するメソッドはあるけど、文字列って中でどう管理されてるんだろ
うーーーー
↓以下完璧版ソース

require "mysql"
require "kconv"

my = Mysql::new("localhost", "root", "hoge")
my.query("set character set utf8")
my.query("use hogedb")


res = my.query("select * from hoge_tbl")
res.each do |col|
  col1 = col[0]
  col2 = col[1]
  puts Kconv.tosjis(col1)
  puts Kconv.tosjis(col2)
end

↓パッチをあてるとか、イロイロ細かいことは↓参考、更新もこちら中心でやると思いますのでこの結果に満足できなかったときは参考までに
http://yakinikunotare.boo.jp/orebase/index.php?Ruby%2Fmysql%A4%CB%C0%DC%C2%B3%A4%B9%A4%EB