【问题标题】:PostgreSQL string escaping settingsPostgreSQL 字符串转义设置
【发布时间】:2013-11-06 22:00:14
【问题描述】:

我有 2 台服务器:S1S2 和相同的 SELECT version() 和相同的数据库 test 包含一个表 t1,其列类型为 text[]

我尝试在其中一个中插入带有符号 " 的 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 实例访问的,但我认为这与问题无关。

【问题讨论】:

  • 不要使用反引号;他们没有任何意义。

标签: sql postgresql


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:
    • 双引号用于引用标识符
    • 单引号用于字符串文字
    • 反引号没有意义(psql 前端除外)
    • VALUES 语句后跟一个逗号 list 括号括起来的表达式列表,每个表达式列表构成一个文字
    • E'string\'with a single quote' 可用于强制 C 样式的反斜杠转义。这是一个 Postgres 扩展。 (现有的在字符串中转义字符的 SQL 方法几乎无法使用)
    • 数组也是一个(有争议的)Postgres 扩展。值列表中的 outer 引号仍然是单引号;如果需要引号 inside '{ ... , ... }' 这些需要是双引号,并启用反斜杠转义。 (这没关系,因为 inside 已经是一个扩展,所以没有任何现有的语法被冒犯)

    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;
    

    【讨论】:

    • 字符串数组呢?我不能写'{'a', 'b'}' 因为第二个' 会与第一个' 冲突
    • 请注意,从 9.1 开始默认不推荐使用 \ 转义字符并禁用该字符。行为取决于配置参数standard_conforming_strings的值:postgresql.org/docs/current/static/…
    猜你喜欢
    • 2019-01-21
    • 2010-09-05
    • 2012-02-04
    • 1970-01-01
    • 2016-04-15
    • 2016-03-29
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    相关资源
    最近更新 更多