转储Postgresql时转义文本内的引号

时间:2011-04-26 02:14:38

标签: sql escaping postgresql

假设我的表是:

  id    text
+-----+----------+
  123 | foo bar
  321 | bar "baz"

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

我的查询格式为:

SELECT text FROM aTable WHERE ...

我希望输出为:

foo bar
bar \"baz\"

而不是:

foo bar
bar baz

2 个答案:

答案 0 :(得分:7)

您可能想要使用replace

SELECT REPLACE(text, '"', E'\\"') FROM aTable WHERE ...

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

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

set standard_conforming_strings = on;
SELECT REPLACE(text, '"', '\"') FROM aTable WHERE ...

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

  

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

这也会影响您的\x5C escape

  

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

答案 1 :(得分:1)

您可以使用COPY命令的以下版本:

COPY (SELECT * FROM table) TO ... WITH FORMAT 'CSV', ESCAPE '<WHATEVER ESCAPE CHARACTER YOU WANT>'

described here

您可能不需要做任何事情,因为在某些情况下,您的QUOTE选项会自动加倍。请参考参考链接的示例。除了VALUES之外,您还可以使用SELECT。不需要进一步的数据修改。

假设您使用的是7.3或更高版本。 7.3和9.0之间的语法略有不同,因此请参阅相应的文档。