2007年05月28日
接続のキャラクタセットおよび照合順序
ほとんどPHPでできているシステムなのですが、訳あってPerlから更新作業をする必要ができてしまい(というかPerlで書きたかった)一通り思い通りに動くものができた。
ところが日本語のデータが化ける。MySQL(バージョンは4.1)で保持している日本語のデータはSJISで格納されている(不本意ながら今さら変えられない)。そして、もちろんDBIでINSERT/UPDATEする時にEncode::decode/encodeを使ってSJISで格納しているにも関わらず化けてしまう。かなり悩んだあげく、やっとMySQLのドキュメントを見つけた。
次のようにconnect()直後に送信/受信のキャラクタセットをSJISであると指定してあげれば良い様です。
sub db_connect {
my $dsn = "DBI:mysql:database=$DB;host=$DB_HOST";
my $dbh = DBI->connect($dsn, $DB_USER, $DB_PASS);
unless ($dbh) {
error("Coudn't connect Database $dsn");
die "Coudn't connect Database $dsn";
}
my $stmt = $dbh->prepare("SET CHARACTER SET SJIS ");
$stmt->execute();
return $dbh;
}
ServerAliveInterval
WindowsのPoderosaからsshでFirewall内のサーバに接続していた時は、セッションのタイムアウトで接続が切れてしまうのに対応するため、「オプション設定」の「ターミナル」にある「KeepAliveパケットを送信する」オプションをONにしていた。
最近、Mac OS Xをメインに使用しているが、Terminalから件のサーバにつないだときに、切れてしまうのをどうすれば良いのか、やっと分かりました。
~/.ssh/config ファイルに下記の行を追加します。
ServerAliveInterval 60
60は60秒です。セッションのタイムアウト時間が長い場合は、環境に合わせてもっと長くするべきかも知れません。



