2017-11-25 514 views
0

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

-- Using two single quotes 
SELECT FROM "users" WHERE "users"."email" = 'o''[email protected]' 

-- Using a backslash 
SELECT FROM "users" WHERE "users"."email" = 'o\'[email protected]' 

我希望有人能提供围绕形式逸出的起源一些情况下,任何的优势或缺点,具有相对于反斜杠形式。

+0

@ muistooshort感谢您的反馈。是的,反引号是基于其他文档中读取的语法。我编辑了问题以反映您的更正。 –

回答

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'foo')之前写入字母E(大写或小写)来指定转义字符串常量 。

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) 
+0

如果设置'standard_conforming_strings'关闭,postgresql将支持没有'e'前缀的反斜杠引用。 – Jasen

+0

是的,但它不是默认的 –

+0

,这取决于您的安装是多久 - 关过去是默认设置。 – Jasen

2

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

反斜杠是一个常见的约定,特别是在基于Unix的机器上,所以很多数据库也支持它。

我更喜欢双引号,因为它是ANSI标准。在Windows和Unix机器之间时,我也会混淆反斜杠。

2

根据this ANSI标准指定使用反斜杠字符\来转义单个'或双重"引号是无效的。所以我会出于便携性原因使​​用双引号。

+0

我编辑的可读性 - 希望我没有破坏这里的意义 –