为啥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支持两个单引号以及反斜杠转义的主要内容,如果未能解决你的问题,请参考以下文章
python脚本中单引号’ 双引号“ 三个单引号‘’‘ 三个双引号”“” 差别 及反斜杠的用法
linux命令学习-引用符号(反斜杠,单引号'',双引号"")
每日linux命令学习-引用符号(反斜杠,单引号'',双引号"")