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