我正在使用Postgres 9.5并且我有一个类型为'json'的列(“info”)...我正在尝试执行此插入:
INSERT INTO table ( info )
VALUES (
'{"entry":"((\+)[0-9]+)"}'
)
但是我收到了这个错误:
ERROR: invalid input syntax for type json
DETAIL: Escape sequence "\+" is invalid.
它将\+
解释为转义序列,但实际上我希望将其作为我的价值的一部分。
答案 0 :(得分:3)
一般来说,
jsonb_build_object
构建对象\
。PostgreSQL没有引用它:它只是RFC 7159之后的JSON实现。
字符串以引号开头和结尾。除了必须转义的字符外,所有Unicode字符都可以放在引号内:引号,反向固定和控制字符(U + 0000到U + 001F)。 [...]因此,例如,只包含一个反向固相字符的字符串可以更紧凑地表示为
"\\"
。
所以它在字面上看起来像这样。
CREATE TABLE tbl
AS
SELECT '{"entry":"((\\+)[0-9]+)"}'::jsonb AS info;
PostgreSQL中的美元引用要求无法逃脱,但这不会有帮助,
请注意,在美元引用的字符串中,可以使用单引号而无需转义。实际上,美元引用字符串中的任何字符都不会被转义:字符串内容始终按字面意思书写。反斜杠不是特殊的,也不是美元符号,除非它们是与开始标记匹配的序列的一部分。
因此{strong>不会起作用,因为\+
不是JSON中的有效字符串。如果我们不使用json类型,它会工作。
SELECT '{"key":"\"}'::jsonb;
ERROR: invalid input syntax for type json
LINE 1: SELECT '{"key":"\"}'::jsonb;
^
DETAIL: Token ""\"}" is invalid.
CONTEXT: JSON data, line 1: {"key":"\"}
但是,您可以使用to_jsonb()
来JSON转义字符串..
SELECT FORMAT( $${%s:%s}$$, to_jsonb(k), to_jsonb(v) )::jsonb
FROM ( VALUES
('key', '\' )
) AS t(k,v);
但是,即使这是一个坏主意,因为如果你有关键和值,你可以使用json_build_object
,
SELECT jsonb_build_object( k, v )
FROM ( VALUES
('key', '\' )
) AS t(k,v);