2017-11-25 14 views
0

最近、2つのシングルクォートがPostgresや他のSQLデータベースで単一引用符をエスケープするのに驚いていました。私が実際に読んでいたドキュメンテーションのいくつかは、単一引用符をエスケープするための「通常の」方法と呼ばれていました。SQLが2つのシングルクォートとバックスラッシュのエスケープをサポートする理由

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

。はい、バックティックは他のドキュメントで読んだ構文に基づいていました。私はあなたの修正を反映するために質問を編集しました。 –

答えて

2

Postgresはさまざまな方法をサポートしています。

標準:

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

バックスラッシュは https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE

を見て、PostgreSQLはまた、ある文字列定数を、「エスケープ」受け入れ、エスケープを認識するEが必要です 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

を見て文字列定数を指定するための標準的な構文は通常、便利 ですが、時に理解することが困難な場合があります目的の文字列 には、それぞれ単一引用符またはバックスラッシュが含まれています。これは、それぞれが を2倍にする必要があるためです。このような状況でよりわかりやすいクエリを可能にするために、 PostgreSQLは、ドルの引用符と呼ばれる別の方法で、 文字列定数を記述します。ドル記号で囲まれた文字列定数は、ドル記号 記号($)、0個以上の文字の任意の「タグ」、別のドル記号 記号、文字列を構成する任意の文字列 内容、ドル記号、このドルの見積もりを開始したのと同じタグ、 ドル記号。フィードバックをありがとう@muistooshort

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

postgresqlは、 'standard_conforming_strings'設定がオフになっている場合、' e'プレフィックスなしでバックスラッシュクォートをサポートします。 – Jasen

+0

はい、デフォルトでは –

+0

ではありません。これは、インストールの経過時間に依存します。デフォルトはオフです。 – Jasen

2

二重一重引用符は、SQLの文字列に一重引用符を入れるANSIの標準的な方法です。

バックスラッシュは一般的な規則で、特にUnixベースのマシンでは一般的です。多くのデータベースもこれをサポートしています。

ANSI規格であるため、二重引用符を使用することをお勧めします。私はまた、WindowsとUnixのボックスの間に行くときにバックスラッシュと混同します。

2

this ANSI規格によると'シングルまたはダブル"引用符をエスケープするバックスラッシュ文字\を使用して無効であることを指定します。ですから、私は移植性の理由から二重引用符を使用します。

+0

私は可読性のために編集しました - 私がここで意味を崩していないことを望みます –

関連する問題