[pgsql-jp: 37348] Re: postgres8.1.4+postgresql-8.1-407.jdbc3で特殊文字が登録できない

Tatsuo Ishii ishii @ sraoss.co.jp
2006年 7月 13日 (木) 23:31:00 JST


石井です.

> postgres8.1.4+postgresql-8.1-407.jdbc3を試しています。
> JDBC経由で特殊文字(〜¢£)を登録しようとしたところ、以下のエラーが発生し
> 登録できませんでした。
> 
> org.postgresql.util.PSQLException: ERROR: character 0xe3809c of encoding
> "UTF8" has no equivalent in "EUC_JP"
> 
> JDBCが原因かと思い、postgres8.1.4+pg74.1jdbc3の組み合わせで試して見ました
> が、同様の事象が発生しました。
>
> postgres7.1.4+pg74.1jdbc3の組み合わせでは発生していませんでした。
> postgres8.1.4で特殊文字に対する仕様がかわったのでしょうか?

8.1.4ではUTF-8からEUC-JPに変換できない場合,エラーになります.

「〜」に対応するUTF8の0xe3809c,すなわちU+301Cは,PostgreSQLの変換表で
は対応は定義されていません.では何に対応しているかというと,U+FF5Eです.
これはMicrosoftが決めた仕様で,PostgreSQLの実装はこれにしたがっている
ことになります.

参考:[pgsql-jp: 28998] 

個人的にはこれはどうかと思うのですが,Microsoftの勢力を無視できない以
上の妥協策かもしれません.

ではどうしたらよいかというと,

1) データベースもUTF-8にする.変換が発生しないので問題がそもそも起きな
   い.

2) PostgreSQLの変換マップに手を入れる.UTF8->EUC_JPの方は問題ありませ
   ん.単に 0xe3809c -> EUC_JPのa1c1 の変換を追加してあげるだけです.
   問題はその逆変換で,マップの構造上,EUCPのa1c1が対応するUTF-8は1個
   に決めなければなりません.すなわち,U+301Cに変更するのか,U+FF5E(現
   状) の選択を迫られるわけです.環境が決まっていてa1c1->U+301Cへの変
   換だけ考えればよいのであれば,変えてしまうのも手だとは思います.

3) PostgreSQLのCREATE CONVERSIONを使ってユーザ定義の変換を追加し,その
   中でU+301C<->a1c1の変換を行うようにする.

個人的には柔軟性がある3)がお勧めです.

もし2) or 3)の方法に興味がおありであれば,具体的な方法を投稿します.
--
Tatsuo Ishii
SRA OSS, Inc. Japan



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