5

我有 2 台服务器:S1S2与包含类型为 的表SELECT version()的相同数据库相同。testt1text[]

我尝试"在其中一个中插入带有符号的 2 个字符串数组:

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

S1效果很好,但S2会引发错误:

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

\让我们在请求中再添加一个:

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

8

在(标准)SQL 中转义单引号是通过使用两个单引号来完成的,例如
'Peter''s house'

我更喜欢使用ARRAY[..]也需要少一个引号的显式,因此您的插入可以写成:

INSERT into t1 (columnname) 
VALUES (ARRAY['str1', 'str2''with quote symbol']);

在 9.1 之前的版本中,Postgres 允许\用作备用转义字符,但如果使用则会记录警告。自 9.1 起,配置参数standard_conforming_strings已启用,因此\不能用作转义单引号。

于 2013-11-06T14:00:14.090 回答
5
  • 双引号用于引用标识符
  • 单引号用于字符串文字
  • 反引号没有意义(除了在 psql 前端)
  • VALUES语句后跟一个带括号的表达式列表的逗号列表,每个表达式列表构成一个文字
  • 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 回答