【问题标题】:Escaping quotes inside text when dumping Postgres Sql转储 Postgresql 时在文本中转义引号
【发布时间】:2011-08-12 17:10:25
【问题描述】:

假设我的桌子是:

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

有什么方法可以在倾倒时避开“baz”周围的那些引号?

我的查询格式为:

SELECT text FROM aTable WHERE ...

我希望输出是:

foo bar
bar \"baz\"

而不是:

foo bar
bar baz

【问题讨论】:

  • 你试过here中的ESCAPE子句吗?
  • @dawebber 我试图避免 COPY,因为我是从 JOIN 中选择的,并且没有办法在上面使用 copy,对吗?
  • 是的,你可以。使用COPY (SELECT * FROM table) TO ... 。它在我之前引用的同一 page 上,在页面中间
  • @dawebber 很高兴知道,谢谢!

标签: sql escaping postgresql


【解决方案1】:

你可能想使用replace:

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

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

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

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

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

这控制普通字符串文字('...')是否按照 SQL 标准的规定处理反斜杠。

这也会影响您的\x5C escape

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

【讨论】:

  • 不推荐使用这种方式的反斜杠。强烈建议使用standard_conforming_strings = on,如果我没记错的话,这将是下一个版本的默认设置。 postgresql.org/docs/9.0/static/…
  • @a_horse_with_no_name:获得` in a string that works in PostgreSQL 8 and 9 without producing any warnings and doesn't care about the standard_conforming_strings` 设置的最佳方法是什么?很多人(包括我)必须同时处理 8 和 9,而且许多人(例如 Heroku 用户)无法完全控制 PostgreSQL 配置。
  • @mu 太短:将单引号 ' 放入字符串很容易:只需将两个引号放入字符串中:'Peter''s bike'。这不受standard_conforming_strings 的影响。双引号也是如此:'12" Inch'standard_conforming_strings 关于在文字中使用反斜杠
  • 谢谢大家,这正是我想要的。顺便说一句,是否可以执行以下操作以避免双反斜杠:REPLACE(text, '"', E'\x5C"')?
  • @a_horse_with_no_name:不,我说的是“\”而不是引号(我忘了在评论中关闭我的反引号,现在修复它为时已晚);那个单反引号应该是`\`。唉,看来我现在在这条评论中遇到了反斜杠问题,多么合适。
【解决方案2】:

您可以使用COPY 命令的以下化身:

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

作为described here

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 2019-12-17
    • 2016-12-06
    相关资源
    最近更新 更多