[pgsql-jp: 31926] Re: 日本語データがINSERT できない

Tatsuo Ishii t-ishii @ sra.co.jp
2004年 1月 7日 (水) 18:41:19 JST


石井です.

> ご指摘の通り、PHPのプログラムはSJISで記述していましたので、
>  (プログラムそのものの文字コードも気をつけないと
>   いけないのですね、勉強になりました)
> それをEUC-JPで書き直し、再度試してみましたところ、
> 
> 今度はDBに登録されたデータが、
> EUC-JPをSJISで変換した状態の文字
>  (研磨剤製品 → クヲヒ蘯゛タスノハ)
>  (文字化けするかもしれないので全角カナにしてあります、実際は半角カナ)
> となってINSERTされてしまっています。
> 
> 先の発言にも書いていますがPHP,PostgresSQLの文字コードは
> EUC-JPとしていると思うのですが・・・

PHPとPostgreSQLが絡むといろいろなところでコード変換がされるので問題が
どこにあるかわかりにくいですね.たとえばこんな感じ.

HTTP->変換1->PHP内部コード->pg_query->変換2->PostgreSQLのパーサ->実行系

とりあえずPostgreSQLの実行系にいったところで実際にどのような文字コード
になっているかを確認するための関数を作りましたので,よかったらお試し下
さい.今回の例ケースだと,pg_queryに,

SELECT strtohex('研磨剤製品');

というSQL文を食わせてみれば,少なくともPostgreSQLのエンジンがどのよう
な文字コードを処理しようとしたかが分かります.EUC_JPなら

       strtohex       
----------------------
 b8a6cbe1badec0bdc9ca
(1 row)

となるはずです.

逆にテーブルに入っている段階のデータの状態は,psqlでもpg_queryからでも

SELECT strtohex(your_column) FROM your_table;

というSQLを食わせて見ればわかります.

ものは
ftp://ftp.sra.co.jp/pub/cmd/postgres/strtohex/strtohex-1.0.tar.gz
にあります.たぶんPostgreSQL 7.2以降ならどれでも動くと思います.
READMEを引用しておきます.
--
Tatsuo Ishii

-------------------------------------------------------------------------
$Id: README.strtohex.euc_jp,v 1.1.1.1 2004/01/07 09:14:57 t-ishii Exp $

strtohex README		2004/01/07 石井達夫

1. strtohexとは

   strtohexは引数の文字列を16進表現にしたものをTEXTとして返します.
   strtohexは文字化けそのほかのトラブルの解析の役に立つ(かもしれません)

2.  strtohexのインストール

    $ cd /usr/local/src/postgresql-7.4.1/contrib    
    $ tar xfz /tmp/strtohex.tar.gz
    $ cd strtohex
    $ make
    $ make install
    $ psql -e -f /usr/local/pgsql/share/contrib/strtohex.sql test

3. strtohexの使い方

   使用例を示します.

test=# SELECT strtohex('日本語');
   strtohex   
--------------
 c6fccbdcb8ec
(1 row)

   この例は,バックエンドの文字コードがEUC_JPの場合です.UTF-8ではどう
   なるか知りたければ,

test=# SELECT strtohex(convert('日本語', 'UTF-8'));
      strtohex      
--------------------
 e697a5e69cace8aa9e
(1 row)

   でわかります.更にSJISではどうか知りたければ(しつこい:-),

test=# SELECT strtohex(convert('日本語', 'SJIS'));
   strtohex   
--------------
 93fa967b8cea
(1 row)

   となります.




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