[pgpool-general-jp: 1569] pgpool がバックエンドに出すクエリのエスケープ文字列構文について

GOTO, Daisuke gotoh @ m-design.com
2018年 8月 15日 (水) 18:23:41 JST


後藤と申します

pgpoolがバックエンドに出すクエリのエスケープ文字列構文について質問です。

環境は
CentOS Linux release 7.4.1708 (Core)
pgpool-II-pg96-3.6.8-1pgdg.rhel7.x86_64
postgresql96-9.6.8-1PGDG.rhel7.x86_64
です。

postgresql.conf には
standard_conforming_strings = off
escape_string_warning = on
が指定されています。

pgpoolはレプリケーションモードで使用しています。
pgpool.conf は
replication_mode = on
load_balance_mode = on
master_slave_mode = off
replicate_select = off
となっています。

サーバのロケールは ja_JP.UTF-8 でデータベースも UTF8 で作成していますが、
クライアントプログラムには sjis 環境なものもあり、
その場合は接続毎に 
SET CLIENT_ENCODING TO 'SJIS' 
を発行しています。

sjis のクライアントでは \x5C「\」と\x27「'」を含む文字がある場合は
エスケープを行いかつエスケープ文字列構文としてリテラルの先頭に E をつけて
「E'代表\者'」のようにしてクエリを作成しているのですが、
これが INSERT 文の場合 pgpool を経由するとバックエンドには E が欠落して
「'代表\者'」としてクエリが発行されてしまい、
「WARNING: 文字列リテラル内で非標準的なエスケープが使用されました」
の警告が出てしまいます。


(1)これは想定通りの動作なのでしょうか。

(2)エスケープ文字列構文の E を欠落させないようにする方法はありますでしょうか。


以上、もし分かる方がいらっしゃいましたらご回答をお願いいたします。


-- 
 後藤 大輔<gotoh @ m-design.com>
 株式会社エム・ディー・シー
 〒212-0012 川崎市幸区中幸町3丁目2
 Tel. 044-555-3185 Fax. 044-555-5700


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