[pgsql-jp: 36854] Re: client encoding と PQexec
Jun Kuriyama
kuriyama @ imgsrc.co.jp
2006年 3月 10日 (金) 09:42:14 JST
At Fri, 10 Mar 2006 09:07:45 +0900,
Koichi Hyodo wrote:
> > libpq を使うクライアント側が入力の escape を行う、というのはもちろん
> > なんですが、(少なくとも私の場合)多くの場合は placeholder を使うので、
> > 明示的に値を escape する、ということはその場合はしていません。
>
> 外しているかもしれませんが、エスケープ処理をlibpqの
> PQescapeString関数で行うように修正できないでしょうか ?
>
> http://www.postgresql.jp/document/pg813doc/html/libpq-exec.html#LIBPQ-EXEC-E
> SCAPE-STRING
>
> この関数はそれなりに古いバージョンのlibpqにも用意されているようです。
> 少なくともencodingに関わらず決め打ちでquoteするよりはよさそうに思います。
一応 DBD::Pg も、7.2.x 以降の場合は libpq 側の PQescapeString を使う
ようになっているようです。
# 前のメールでの DBD::Pg が自前で quote してる、というのはかなり古いサー
# バ相手のみのようです。迂闊でした。
今確認してみたのですが、7.4.12 の PQescapeString はバイト単位で単純
に ' と \ をエスケープしているだけのようです。8.1.3 の PQescapeString
はマクロを使ってシンプルに書き換えられていましたが、
----- src/include/c.h
#define SQL_STR_DOUBLE(ch) ((ch) == '\'' || (ch) == '\\')
----- src/interfaces/libpq/fe-exec.c
while (remaining > 0 && *source != '\0')
{
if (SQL_STR_DOUBLE(*source))
*target++ = *source;
*target++ = *source++;
remaining--;
}
-----
となっていましたので、これも特に encoding を意識しているわけではなさそ
うです。
--
Jun Kuriyama <kuriyama @ imgsrc.co.jp> // IMG SRC, Inc.
pgsql-jp メーリングリストの案内