我有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)
| 归档时间: |
|
| 查看次数: |
9805 次 |
| 最近记录: |