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

Jun Kuriyama kuriyama @ imgsrc.co.jp
2006年 3月 10日 (金) 11:29:38 JST


At Fri, 10 Mar 2006 10:15:26 +0900 (JST),
Tatsuo Ishii wrote:
> >  今回、Perl モジュールの DBD::Pg が、サーバのバージョンが古い時には
> > placeholder を見つけると自分で quote 処理を行って、placeholder の場所
> > に quoted value を入れた SQL 文を作る、ということをしているのですが、
> 
> うわー,そうなんですか.危なそう...こういう「なんちゃってparameterized
> query風実装」は使わない方がよいと個人的には思います.

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

> > DBD::Pg 側が PQexec に渡す SQL 文字列を作るときに、insert 時の value 
> > の所など single quote 文字で括られた値が、バイト単位の quote 処理を行
> > うべきなのか、encoding を意識した文字単位の quote をするべきか、という
> > のがわからなかったのです。
> > 
> > # なんかうまく伝えられる自信がなくなってきた……。
> > #
> > # 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 の定義が変わってしまいますか?

# しかも遅くなりそう……。


-- 
Jun Kuriyama <kuriyama @ imgsrc.co.jp> // IMG SRC, Inc.



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