[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 メーリングリストの案内