RailsとMySQLの不具合。いつか経験するかも

132 名前:nobodyさん[sage] 投稿日:2006/07/11(火) 13:06:21 ID:???
WEBrickで立ち上げて使っているんですが、しばらくするとデータベース
から取得した文字の表示が化けてしまいます。プロセスを切って再起動する
と正しく表示されます。

databaseのutf8設定をしていない時と同じような化け方なので、内部で
データベース接続が切れたときの再接続で SET NAMES utf8が発行されない
ケースがあるのかなぁなどと思っているのですが、よくわかりません。
このような現象に合っている方はいらっしゃいますか?
また、対応策等ご存じの方いらっしゃいますでしょうか?

Debian3.1 Sargeで関連パッケージはこんな感じです。
ruby     1.8.2-1
ruby1.8  1.8.2-7sarge2
mysql-server-4.1   4.1.11a-4sarge4
libmysql-ruby1.8   2.4.5-6.1
libdbd-mysql-ruby1.8  0.0.23-2

gem list
rails (1.1.4)
activerecord (1.14.3)

日本語(UTF8)対応設定は以下のようにしています。
[config/environment.rb]
$KCODE = "UTF8"

(続く)

133 名前:132[sage] 投稿日:2006/07/11(火) 13:07:38 ID:???
(続き)
[config/database.yml]
development:
adapter: mysql
database: foobar_development
username: ""
password:
host: localhost
encoding: utf8

[app/controllers/application.rb]
class ApplicationController < ActionController::Base
before_filter :set_charset

private
def set_charset
headers["Content-Type"] = "text/html; charset=UTF-8"
end
end

mysqldはデフォルトutf8にして、DB、テーブル等も作っていますが、
コマンドラインから接続した場合は、

mysql foobar
直後に SET NAMES utf8 を入力するか、

mysql --default-character-set foobar
としないと、文字化けしています。

何かヒントがあれば、教えてください。よろしくお願いします。

135 名前:nobodyさん[sage] 投稿日:2006/07/11(火) 23:23:05 ID:???
>131

http://www.mysql.gr.jp/mysqlml/mysql/msg/12306

もしかしたら、これかもしれない、、、、が確証はないのでMtSQLのバージョンあげられるようでしたら試してみて下さい。
自分は、PHPMySQL文字コードで泣いた人間なのでポスグレかsqliteばかりだ、、、

136 名前:nobodyさん[sage] 投稿日:2006/07/11(火) 23:24:29 ID:???
>132
同一症状です。
MySQL5.021でそうなっています。
MONGRELだと今のところその症状は出てません。


>>132
後ろ向きだが、set_charset の中で毎回設定すればいい。

ActiveRecord::Base.connection.execute("SET NAMES utf8")

これで直れば、32の推測通りARの不具合の可能性がでてくる。
まずは、これを試して問題を切り分けるのがよいと思われ。
MYSqlのML
http://www.mysql.gr.jp/mysqlml/mysql/msg/9530 で話題になっていたように、
ver. 4.1以降、クライアント/サーバー間でキャラクターセットが自動的に
変換されるようになったことに伴い、多くの方が文字化けといった問題に
悩まされていたかと思います。

この点については開発側に改善を要求してきましたが、4.1.15にて
"--skip-character-set-client-handshake" というオプションが導入されました。
http://dev.mysql.com/doc/refman/4.1/en/news-4-1-15.html

このオプションを指定することにより、クライアントのキャラクターセットが
サーバー側のキャラクターセットに合わせて自動的に設定され、
自動変換が発生しないようになります。特にver. 4.0から移行する際に、
このオプションの利用を徹底すれば、多くのトラブルが回避できるのでは
ないでしょうか。ぜひ、お試し下さい。