PostgreSQL字符串转义设置

pav*_*din 5 sql postgresql

我有2个服务器:S1,S2用相同的SELECT version()具有相同的数据库test包含的表t1具有类型的柱text[].

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

INSERT into t1 (columnname) VALUES (`{"str1", "str2\"with quote symbol"}`)
Run Code Online (Sandbox Code Playgroud)

S1效果很好,但S2会抛出错误:

ERROR:  malformed array literal: "{"str1", "str2"with quote symbol"}"
Run Code Online (Sandbox Code Playgroud)

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

INSERT into t1 (columnname) VALUES (`{"str1", "str2\\"with quote symbol"}`)
Run Code Online (Sandbox Code Playgroud)

现在S2有效,但S1说:

ERROR:  malformed array literal: "{"str1", "str2\\"with quote symbol"}"
Run Code Online (Sandbox Code Playgroud)

在postgres的某处是否有一些转义设置?

服务器通过2个独立的pgbouncer实例访问,但我认为这与问题无关.

a_h*_*ame 8

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

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

INSERT into t1 (columnname) 
VALUES (ARRAY['str1', 'str2''with quote symbol']);
Run Code Online (Sandbox Code Playgroud)

在9.1之前的版本中,Postgres允许\用作备用转义字符,但如果使用则会记录警告.从9.1开始,config参数standard_conforming_strings被启用,因此\不能用作单引号的转义符.


wil*_*ser 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;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,从 9.1 开始,默认情况下不推荐使用和禁用 \ 转义字符。行为取决于配置参数`standard_conforming_strings`的值:http://www.postgresql.org/docs/current/static/runtime-config-compatible.html#GUC-STANDARD-CONFORMING-STRINGS (2认同)