[pgsql-jp: 33683] Re: jdbc経由で「〜」の登録

Ryouichi Matsuda r-matuda @ sra.co.jp
2004年 7月 15日 (木) 16:19:01 JST


松田です。

On Tue, 13 Jul 2004 18:11:36 +0900, icc10325 wrote:
> よく見られる「〜」の文字化けに関する問題なのですが、「〜」をPostgrSQLに
> 登録した場合文字化けどころか登録すらされません。

Javaでの一般的な原因については、ここが参考になります。
    http://www.gimlay.org/~javafaq/S146.html#S146-09


> 「登録されない」というのは「あ〜い〜う」をINSERTするとPostgreSQLには「あ
> いう」と登録されています。つまり「〜」だけが欠落している感じです。

PostgreSQL JDBCは、データベースとはUTF-8で通信します。

データベースの文字エンコーディングがEUC_JPならば、PostgreSQLの
サーバ内でUTF-8に変換して通信するように、JDBCが自動的に要請して
います。

実は、最近のPostgreSQLの「EUC_JP⇔UNICODE」の変換表は、Javaの
「EUC_JP⇔UNICODE」では無く、「Windows-31J⇔UNICODE」と互換性が
あります。(これにより、機種依存文字も扱うことが出来ます)

つまり「〜」については、次のような関係になります:

    JavaのEUC_JPで「〜」をUNICODEに変換した文字コード値
      ≠
    PostgreSQLのEUC_JPで「〜」をUNICODEに変換した文字コード値
      =
    JavaのWindows-31Jで「〜」をUNICODEに変換した文字コード値

変換表に無い文字を変換しようとしたとき、Javaの場合は「?」に変換
されますが、PostgreSQLの場合は、その文字が消されてしまいます。
(PostgreSQLのログファイルに、変換できなかった事が記録されます)


> この現象について何かご存じの方がいらっしゃいましたらご教授下さい。

対処法1:
    データベースの文字エンコーディングをUNICODEにする。

対処法2:
    Javaプログラムやリソースの文字エンコーディングを、すべて
    Windows-31J(MSシフトJIS)にする。

対処法3:
    Javaプログラムで「〜」の文字コード値を、そのつど変換する。


私が開発するときは、対処法2の方法を使っています。

___________________________________________________________
 Ryouichi Matsuda  (http://www.sra.co.jp/people/r-matuda/)




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