Ruby/MySQL で ProtocolError が出るとき

そろそろ 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 使用禁止」と思っておいた方がよさそう。