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

时间:2017-11-25 16:55:13

标签: sql postgresql security escaping

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

-- 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'

我希望有人可以提供一些关于这种逃避形式的起源的背景,以及它相对于反斜杠形式的任何优点或缺点。

3 个答案:

答案 0 :(得分:2)

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

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

我更喜欢双单引号,因为它是ANSI标准。在Windows和Unix盒之间进行操作时,我也会对反斜杠感到困惑。

答案 1 :(得分:2)

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

答案 2 :(得分: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提供了另一种称为“美元引用”的方式来编写   字符串常量。美元引用的字符串常量由一美元组成   sign($),一个零或多个字符的可选“标记”,另一个美元   符号,构成字符串的任意字符序列   内容,美元符号,开始这个美元报价的相同标签,以及   美元符号。

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