[pgsql-jp: 25196] Re: JDBCドライバ(7.2) でのエンコーディング判断障害

Tatsuo Ishii t-ishii @ sra.co.jp
2002年 3月 10日 (日) 10:04:43 JST


石井です.

> 最近PostgreSQLを使い出しました。(2日目です)
> JDBCドライバを使って次の環境で評価していましたが、
> 日本語エンコーディングの判断に障害が見られるようなので
> 報告します。
> 
> ※既知の障害あるいは私の設定ミスが考えられる場合は
>   ご指摘下さい。
>   また、バグ報告などの宛先等ご教示下されば幸いです。

日本だとこのMLですが,英語がOKなら本家の(www.postgresql.org参照)が正式
なバグ情報の送付先になります.
[略]
> ■障害の原因と思われる箇所
> 上記トレースにあるencodingは、
> org.postgresql.Connection#openConnection()の中で
> 次の命令によって取得しています。
> set datestyle to 'ISO'; select version(), 
>   case when pg_encoding_to_char(1) = 'SQL_ASCII'
>   then 'UNKNOWN' else get
> 
> ※結果
>                            version                           | getdatabaseencoding
> -------------------------------------------------------------+---------------------
>  PostgreSQL 7.2 on i586-pc-linux-gnu, compiled by GCC 2.95.2 | EUC_JP
> 
> このため、ストリームから実際に取得しているデータは
> シフトJISであるのにもかかわらず、
> JavaのStringに変換する際にはエンコーディングタイプをEUC_JP
> としてnewするために文字化けが発生しています。
> 
> ■対応案
> サーバから送られて来るデータがシフトJISでなので、
> そのエンコーディング名を取得するように変更する
> 必要があると思われます。
> またはその逆で、PGCLIENTENCODINGの値に関係なく
> DBのエンコーディングでサーバ側が送信すると
> いうように変更するか、です。

ほぼ田中さんの分析通りですが,これは既知の問題で,Connection.javaの328
位からのコメントに書いてある通りです.

対処方法ですが,7.1など,7.2よりも前のバージョンのPostgreSQLのサーバに
接続する必要がなければ,342行目の

"case when pg_encoding_to_char(1) = 'SQL_ASCII' then 'UNKNOWN' else
getdatabaseencoding() end";

を

"case when pg_encoding_to_char(1) = 'SQL_ASCII' then 'UNKNOWN' else
pg_client_encoding() end";

に変更すればOKです.

あるいはプロパティcharSetにSJISをセットしてもいけると思いますが,試し
ていません.

> ★その他気になったこと
> org.postgresql.core.Encodingクラスの中で設定されている
> エンコーディング名に"MS932"が見当たりません。(SJISはあります)
> ご存じのようにJDK1.2以降、Windowsでのデフォルトエンコーディングは
> "MS932"になっています。
> このあたりの対応をうまく行わないと、「〜」などの文字が
> 化ける原因になるのではないかな、と思いました。

うーん,このあたりの事情は良く分かりません.フォローをお願いします >
詳しい方

> DB側のエンコードでSJISの指定が不可能ならば
> MS932<->SJISでの問題は現状起きませんが、
> Windows版PostgreSQLもあるようなので(私は未使用)
> 少し心配です。

PostgreSQLはDBエンコーディングにSJISやMS932は指定できません.
--
Tatsuo Ishii



pgsql-jp メーリングリストの案内