[pgsql-jp: 36858] Re: client encoding と PQexec

Tatsuo Ishii ishii @ sraoss.co.jp
2006年 3月 10日 (金) 12:43:33 JST


石井です.

> > うわー,そうなんですか.危なそう...こういう「なんちゃってparameterized
> > query風実装」は使わない方がよいと個人的には思います.
> 
>  これは主に昔の PostgreSQL (7.2.x 世代?) をサポートするため、だとは思
> うのですが、現在の DBD::Pg では 7.4.x で PQexecPrepared が使える場合で
> も、全てのパラメータの型を指定しないと PQexecPrepared を使いません(サー
> バが 8.x なら大丈夫)。
>  PQprepare の際に paramTypes[] に 0 を入れてサーバ側に型を推測させる、
> という機能を正しく使えていないような箇所を見つけたので、それを直せばよ
> り多くの場面で PQexecPrepared が使えるようになるかもしれませんので、
> ちょっとそこを攻めてみます。

そういう実装なんですか.DBD::Pgの内部処理がサーバのバージョンによって
変わってしまうというのは,結構危険な感じがしますね.

> > > # なんかうまく伝えられる自信がなくなってきた……。
> > > #
> > > # client encoding が sjis, server(db) encoding が euc の時に、
> > > # PQexec() に渡すのは
> > > # insert into test (colname) values ('ヘソ');
> > > # であるべきか、
> > > # insert into test (colname) values ('ヘソ\');
> > > # であるべきか、ということなのですが。
> > 
> > こっちであるべきですね.
> > 
> > > insert into test (colname) values ('ヘソ');
> 
>  ありがとうございます。とするとやはり encoding aware な文字単位の 
> quote をしないといけないのですね。
>  さーてどうするかな。
> 
>  libpq 側の PQescapeString が、client encoding と server (db)
> encoding が異なる場合には、入力を server encoding に直した上で quote 
> してさらに client encoding に戻してそれを返す、などとしてしまうと
> PQescapeString の定義が変わってしまいますか?
> 
> # しかも遅くなりそう……。

それは無理と言うか,必要ありません.エンコーディング変換の機能は
PostgreSQLのバックエンド内部でしか利用できません.
# それとも,エンコーディング変換をPerlでやる話でしたっけ?

PQescapeStringがクライアントエンコーディングを理解するように修正するか,
同等の処理をDBD::Pgでやれば良いと思います.
--
Tatsuo Ishii
SRA OSS, Inc. Japan



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