5

私は 2 つのサーバーを持っています: S1、タイプ の列を持つテーブルを含む同じデータベースと同じS2です。SELECT version()testt1text[]

そのうちの1つにシンボルを含む2つの文字列の配列を挿入しようとして"います:

INSERT into t1 (columnname) VALUES (`{"str1", "str2\"with quote symbol"}`)

S1うまく動作S2しますが、エラーがスローされます:

ERROR:  malformed array literal: "{"str1", "str2"with quote symbol"}"

\リクエストにもう 1 つ追加します。

INSERT into t1 (columnname) VALUES (`{"str1", "str2\\"with quote symbol"}`)

現在S2は動作しますが、次のようにS1述べています。

ERROR:  malformed array literal: "{"str1", "str2\\"with quote symbol"}"

postgres のどこかにエスケープ設定はありますか?

サーバーは 2 つの独立した pgbouncer インスタンスを介してアクセスされますが、それは質問とは関係ないと思います。

4

2 に答える 2

5
  • 二重引用符は、識別子を引用するために使用されます
  • 文字列リテラルには一重引用符が使用されます
  • バッククォートには意味がありません (psql フロントエンドを除く)
  • ステートメントの後には、括弧で囲まVALUESれた式リストのカンマリストが続きます。各式リストは 1 つのリテラルを構成します。
  • E'string\'with a single quote'C スタイルのバックスラッシュのエスケープを強制するために使用できます。Postgres 拡張機能です。(文字列内の文字をエスケープする既存の SQL の方法はほとんど使用できません)
  • 配列は (議論の余地のある) Postgres 拡張機能でもあります。値リストの外側の引用符は、依然として一重引用符です。これらの内部で引用符が必要な場合は'{ ... , ... }'、二重引用符である必要があり、バックスラッシュのエスケープが有効になっています。(これは問題ありません。内部 は既に拡張機能であるため、既存の構文に違反することはありません)

CREATE TABLE t1 (columnname varchar);
INSERT into t1 (columnname) VALUES ('str1') ,( E'str2\'with quote symbol');

CREATE TABLE t2 ("Columnname" varchar[] );
INSERT into t2 ("Columnname") VALUES ( '{ "str1" , "str2\"with a double quote" }' );

SELECT * FROM t1;
SELECT * FROM t2;
于 2013-11-06T13:00:08.780 に答える