[pgsql-jp: 29000] Re: 7.3.xのJDBC ドライバで,特定文字のみ文字化け

Tatsuo Ishii t-ishii @ sra.co.jp
2003年 2月 10日 (月) 20:10:30 JST


石井です.

(私がやったわけではありませんが)7.3での文字コード変換のマッピング変
更があちこちで波紋を呼んでいるようですね.

> PostgreSQL のソースを変更しないですむワークアラウンドとしては、
> 
> ・これまでにも出ましたが JVM との入出力を MS932 変換にしてしまう。
>   1.4 ならば Windows-31J などです。
>   # Shift_JIS はJDKのバージョンにより変換が異なりますので注意してください
> 
> ・PostgreSQL のコンバータを使わない
>   PostgreSQL を Unicode にして psql も Unicode にする。

第3の方法としては,7.3で追加されたCREATE CONVERSIONを使ってMS932変換で
ない新しい変換(CONVERSION)を作る方法があります.EUC_JP絡みのCONVERSION
は,以下のように検索できます.

test=# select * from pg_conversion where conforencoding = 1 or contoencoding = 1;
     conname     | connamespace | conowner | conforencoding | contoencoding |    conproc     | condefault 
-----------------+--------------+----------+----------------+---------------+----------------+------------
 euc_jp_to_sjis  |           11 |        1 |              1 |            28 | euc_jp_to_sjis | t
 sjis_to_euc_jp  |           11 |        1 |             28 |             1 | sjis_to_euc_jp | t
 euc_jp_to_mic   |           11 |        1 |              1 |             7 | euc_jp_to_mic  | t
 mic_to_euc_jp   |           11 |        1 |              7 |             1 | mic_to_euc_jp  | t
 euc_jp_to_utf_8 |           11 |        1 |              1 |             6 | euc_jp_to_utf8 | t
 utf_8_to_euc_jp |           11 |        1 |              6 |             1 | utf8_to_euc_jp | t
(6 rows)

たとえばEUC_JP <--> UTF-8 のCONVERSIONを入れ替えたい場合は,マッピング
を変更した新しい関数を作り,pg_conversionから euc_jp_to_utf_8 と
utf_8_to_euc_jp をDROP CONVERSIONし,新しい関数をCREATE DEFAULT
CONVERSIONで登録すれば良いわけです.

pg_conversionをいじるのが怖い人は,schemaを使えば既存のCONVERSIONを変
更せずに済みます.すなわち,CREATE SCHEMAでユーザ名と同じ名前のスキー
マを作り,そのスキーマにCREATE DEFAULT CONVERSIONで新しいコンバージョ
ンを登録します.

まあ,これだけでは良くわからないでしょうから,実際にやってみたい方がい
らしたらまたお手伝いさせていただきます.

参考: src/backend/utils/mb/conversion_procs/README.euc_jp
--
Tatsuo Ishii



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