转储Postgres Sql时转义文本内的引号

Mar*_*rco 7 sql postgresql escaping

我们说我的桌子是:

  id    text
+-----+----------+
  123 | foo bar
  321 | bar "baz"
Run Code Online (Sandbox Code Playgroud)

在倾销时有没有办法逃避'baz'周围的那些报价?

我的查询形式如下:

SELECT text FROM aTable WHERE ...
Run Code Online (Sandbox Code Playgroud)

我希望输出为:

foo bar
bar \"baz\"
Run Code Online (Sandbox Code Playgroud)

而不是:

foo bar
bar baz
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 7

您可能想要使用replace:

SELECT REPLACE(text, '"', E'\\"') FROM aTable WHERE ...
Run Code Online (Sandbox Code Playgroud)

您需要转义转义字符以获取文字反斜杠(因此加倍反斜杠)并在替换字符串上使用"E"前缀以获得正确的转义语法.

更新:感谢a_horse_with_no_name通常的严格(BTW是一件好事),我们有一个解决方案,不需要额外的反斜杠或非标准的"E"前缀:

set standard_conforming_strings = on;
SELECT REPLACE(text, '"', '\"') FROM aTable WHERE ...
Run Code Online (Sandbox Code Playgroud)

standard_conforming_strings选项告诉PostgreSQL使用SQL字符串的标准语法:

这控制普通的字符串文字('...')是否按字面意思处理反斜杠,如SQL标准中所规定的那样.

这也会影响你的\x5C逃生:

如果配置参数standard_conforming_strings已关闭,则PostgreSQL会识别常规和转义字符串常量中的反斜杠转义.这是为了向后兼容历史行为,其中始终识别反斜杠转义.