我有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实例访问,但我认为这与问题无关.
在(标准)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
被启用,因此\
不能用作单引号的转义符.
VALUES
语句后面是一个带括号的表达式列表的逗号列表,每个表达式列表构成一个文字行。E'string\'with a single quote'
可用于强制 C 风格的反斜杠转义。它是一个 Postgres 扩展。(现有的在字符串中转义字符的 SQL 方法几乎不可用)'{ ... , ... }'
这些都需要加双引号,反斜杠逃逸被启用。(这没关系,因为里面 已经是一个扩展,所以没有冒犯现有的语法)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)