そろそろ Ruby 1.9.2 の足音も聞こえてきたし、Ruby 1.8 用に作ってきた今までのスクリプトも 1.9 向けに直そうかな、せっかくだから MySQL/Ruby から Ruby/MySQL に切り替えよう、というシチュエーションでこんなエラーが出てしまう。
.../ruby-mysql-2.9.3/lib/mysql/protocol.rb:632:in `read_eof_packet': packet is not EOF (Mysql::ProtocolError)
しかし同じコードを irb にコピペしたら動く。
うーんなんでだろうと思ったら、先頭に
#!/usr/bin/ruby -Ku
と書いていたせいだった。 -Ku を削ると、エラーが出なくなる。
「Ruby M17N の設計と実装」によれば、
magic comment > コマンドラインの -K > RUBYOPT の -K > shebang の -K > US-ASCII
とのことだが、
#!/usr/bin/ruby -Ku # -*- coding: utf-8 -*-
などとしても、-Ku を削らない限り同じエラーが発生する。
ソースを少し追いかけた感じだと、encoding が utf-8 な文字列にバイナリ(TCPSocket::read の返値)を concat したときに何か起きているっぽいが……
Ruby 1.9 で -K の使用はもともと推奨されていないけど、予想外の影響があるという意味では、「Ruby 1.9 では -K 使用禁止」と思っておいた方がよさそう。