为啥SQL支持两个单引号以及反斜杠转义

Posted

技术标签:

【中文标题】为啥SQL支持两个单引号以及反斜杠转义【英文标题】:Why does SQL support two single quotes as well as backslash escaping为什么SQL支持两个单引号以及反斜杠转义 【发布时间】:2018-05-09 08:42:09 【问题描述】:

我最近惊讶地发现,在 Postgres 和其他 SQL 数据库中,两个单引号是转义单引号的有效方法(作为使用反斜杠的替代方法)。我正在阅读的一些文档实际上将其称为转义单引号的“正常”方式。

-- Using two single quotes
SELECT FROM "users" WHERE "users"."email" = 'o''keefe@email.com'

-- Using a backslash
SELECT FROM "users" WHERE "users"."email" = 'o\'keefe@email.com'

我希望有人能提供一些关于这种转义形式的起源的背景信息,以及它相对于反斜杠形式的优点或缺点。

【问题讨论】:

@muistooshort 感谢您的反馈。是的,反引号是基于在其他文档中读取的语法。我已编辑问题以反映您的更正。 "SQL" 不支持反斜杠 - 这是 Postgres 支持的扩展,不鼓励使用它 【参考方案1】:

根据this ANSI 标准指定使用反斜杠字符\ 转义单' 或双" 引号是无效的。因此,出于可移植性的原因,我会使用双单引号。

【讨论】:

为了可读性我编辑了 - 希望我没有破坏这里的感觉【参考方案2】:

postgres 支持多种方式:

标准:

t=# select 'the quote is ''';
    ?column?
----------------
 the quote is '
(1 row)

反斜杠需要E 来识别转义,看 https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE

PostgreSQL 也接受“转义”字符串常量,它们是 SQL 标准的扩展。指定了转义字符串常量 在开头之前写下字母 E(大写或小写) 单引号,例如,E'foo'。

t=# select e'the quote is \'';
    ?column?
----------------
 the quote is '
(1 row)

最后是最有效且完全非标准的美元报价,请看这里https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING

虽然指定字符串常量的标准语法通常是 方便,当需要的字符串时可能很难理解 包含许多单引号或反斜杠,因为它们中的每一个都必须 加倍。为了在这种情况下允许更具可读性的查询, PostgreSQL 提供了另一种方式,称为“美元报价”,用于编写 字符串常量。一个美元引用的字符串常量由一个美元组成 符号 ($),零个或多个字符的可选“标签”,另一个美元 符号,组成字符串的任意字符序列 内容、美元符号、开始此美元报价的同一标签,以及 美元符号。

t=# select $dollar_quotes$the quote is '$dollar_quotes$;
    ?column?
----------------
 the quote is '
(1 row)

【讨论】:

postgresql 将支持不带 e 前缀的反斜杠引用,如果设置 standard_conforming_strings 已关闭。 这取决于您的安装时间 - 关闭曾经是默认设置。 是的,但是 9.1 已经 8 岁了,从那以后他们改变了默认值。坦率地说,我与 postgres 存在差距,并以 9.3 回来,所以对我来说,上次没有 e for c 的安装就像逃生一样是 15 年前。您认为我应该在@Jasen 的回答中提及standard_conforming_strings 我已经提到过了。这可能已经足够了。【参考方案3】:

双单引号是将单引号放入 SQL 字符串中的 ANSI 标准方式。

反斜杠是一种常见的约定,尤其是在基于 Unix 的机器上,因此许多数据库也支持它。

我更喜欢双单引号,因为它是 ANSI 标准。在 Windows 和 Unix 机器之间切换时,我也会对反斜杠感到困惑。

【讨论】:

以上是关于为啥SQL支持两个单引号以及反斜杠转义的主要内容,如果未能解决你的问题,请参考以下文章

关于js怎样替换反斜杠和单引号的问题

python脚本中单引号’ 双引号“ 三个单引号‘’‘ 三个双引号”“” 差别 及反斜杠的用法

linux命令学习-引用符号(反斜杠,单引号'',双引号"")

每日linux命令学习-引用符号(反斜杠,单引号'',双引号"")

使用awk,后跟单引号时如何匹配反斜杠字符(是的,这是两个字符)

shell中单引号怎么转义