[pgsql-jp: 25225] Re: Windows上JDBC でのエンコーディング

Tsunehisa Kazawa kazawa @ sons.co.jp
2002年 3月 11日 (月) 19:08:49 JST


加澤です。試してみました。

Tsunehisa Kazawa wrote:
> (明示的に指定された Encoding がある場合はそれを最優先で使うよう
> なコードになっているように見えます。後でちょっと試してみますね。)

テスト環境として
・PostgreSQL 7.2 (--enable-multibyte=EUC_JP)
・7.2 付属の JDBC2 ドライバ
・Solaris 8 for Intel
・J2SDK1.3.1_01

というものの上に encoding は EUC_JP で sjis_test という DB を作り、
その中に

create table test_table (
    test_text    varchar
);

というテーブルを作りました。さらに、

insert into test_table (test_text) values ('〜');

として「〜」一文字が入ったデータを作りました (ここまでは全て EUC-JP
環境で行っています)。

さてこの状態で次のようなテストプログラムを走らせました。

import java.sql.*;
import java.util.*;
public class jdbc_test {
    public static void main(String[] args) throws Exception {
        Class.forName("org.postgresql.Driver");
        Properties prop = new Properties();
        prop.put("user", "postgres");
        prop.put("password", "");
        prop.put("charSet", "MS932");
        Connection conn = DriverManager.getConnection(
            "jdbc:postgresql://localhost/sjis_test", prop);
        Statement stat = conn.createStatement();
        stat.executeUpdate("set client_encoding to 'sjis'"); //(1)
        ResultSet rs = stat.executeQuery("select * from test_table");
        while (rs.next()) {
            System.out.println("RESULT=" + rs.getString(1) + ":"
                + Integer.toString(rs.getString(1).charAt(0), 16));
        }
        stat.close();
        conn.close();
    }
}

結果は

RESULT=  :ff5e

と、MS932 コンバータを使って読み込んだ時と同様のマッピングとなってい
るように見えます。これで OK なのではないでしょうか。

(文字そのものの部分が見えないのはこの場合にデフォルトで使われる EUC-JP
コンバータが \uff5e を見える形に変換しない (例の 3bytes になる) ため
です。)

参考までに、今回のテスト環境ではサンプルコードの (1) の部分をコメント
アウトし、代わりに環境変数 PGCLIENTENCODING をセットした状態で実験す
ると、なんだかおかしなデータが出力されました。サンプルコードではコンバー
タを MS932 に固定しているため、PostgreSQL 側から送られてくるデータの
エンコーディングとの不整合が起きているものと思いますが、どうしてそうな
るのかはあまり追求していません。

以上です。

-- 
加澤恒央
Tsunehisa KAZAWA
kazawa @ sons.co.jp
SONS,. Ltd. Programmer



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