【问题标题】:WARNING: nonstandard use of escape in a string literal警告:在字符串文字中非标准使用转义
【发布时间】:2017-02-01 07:06:50
【问题描述】:

我有查询要删除双空格并将其转换为单空格。

UPDATE tablename SET name=trim(regexp_replace(name,'\s\s+',' ', 'g'));

报错:

WARNING: nonstandard use of escape in a string literal
HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'.

【问题讨论】:

  • 这可能是PostgreSQL的旧版本,你能告诉我们是哪一个吗?
  • 版本 1.22.0 测试版
  • 这很可能是您的 pgAdmin 版本。你的 Postgres 版本是什么? SELECT version();
  • @ErwinBrandstetter PostgreSQL 9.0.18 on x86_64-unknown-linux-gnu,由 GCC gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-52) 编译,64 位

标签: regex postgresql escaping


【解决方案1】:

您正在运行旧版本的 Postgres,设置为 escape_string_warning = on(默认)和 standard_conforming_strings = off过时!,自 Postgres 9.1 起默认为 on)。 The manual:

escape_string_warning(boolean)

打开时,如果反斜杠 (\) 出现在普通文本中,则会发出警告 字符串文字('...' 语法)和 standard_conforming_stringsoff。 默认为on。 (...)

只修复语法并摆脱WARNING

trim(regexp_replace(name, E'\\s\\s+', ' ', 'g'))

正确的解决方案:升级到当前版本的 Postgres,或将过时的设置修复为 standard_conforming_strings =on
在现代 Postgres 中,您拥有的表达式按原样有效。

准确地说,\s is the class shorthand for [[:space:]],包括任何white space(包括制表符、nbsp 等)。您的表达式用单个空格字符替换任何两个或多个空格字符的字符串。符合您描述的表达式是:

trim(regexp_replace(name,'  +', ' ', 'g'))

...无论版本和以上设置如何,它都可以工作。

相关:

【讨论】:

【解决方案2】:

下面的也应该可以。

trim(regexp_replace(name,E'\s+','\s{2}',

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-09-30
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多