文字列リテラル
一重引用符のエスケープ'
それらを2倍にすることによって->''
これは標準的な方法であり、もちろん機能します:
'user's log' -- incorrect syntax (unbalanced quote)
'user''s log'
プレーンな一重引用符(ASCII / UTF-8コード39)、バックティックではなく、気を付けてください`
、Postgresでは特別な目的はなく(他の特定のRDBMSとは異なり)、"
を二重引用符で囲みません。 、識別子に使用されます。
古いバージョンの場合、またはstandard_conforming_strings = off
で実行している場合 または、通常、文字列の前にE
を付ける場合 Posixエスケープ文字列構文を宣言する 、バックスラッシュ\
でエスケープすることもできます :
E'user\'s log'
バックスラッシュ自体は、別のバックスラッシュでエスケープされます。ただし、これは一般的には望ましくありません。
多くの単一引用符または複数のエスケープレイヤーを処理する必要がある場合は、PostgreSQLでドル引用符で囲まれた文字列を使用して地獄を引用することを回避できます。 :
'escape '' with '''''
$$escape ' with ''$$
ドル引用符間の混乱をさらに回避するには、各ペアに一意のトークンを追加します。
$token$escape ' with ''$token$
これは、任意の数のレベルにネストできます:
$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$
$
の場合は注意してください 文字は、クライアントソフトウェアで特別な意味を持つ必要があります。さらにそれを逃れる必要があるかもしれません。これは、psqlやpgAdminなどの標準のPostgreSQLクライアントには当てはまりません。
これはすべて、plpgsql関数またはアドホックSQLコマンドを作成するのに非常に役立ちます。ただし、ユーザー入力が可能な場合に、アプリケーションでのSQLインジェクションを防ぐために、プリペアドステートメントやその他の方法を使用する必要性を軽減することはできません。 @Craigの答えはそれについてもっとあります。詳細:
- Postgres関数でのSQLインジェクションと準備されたクエリ
Postgres内の値
データベース内の値を処理する場合、文字列を適切に引用するための便利な関数がいくつかあります。
-
quote_literal()
またはquote_nullable()
-後者は文字列NULL
を出力します null入力の場合。 (quote_ident()
もあります 二重引用符 有効なSQL識別子を取得するために必要な文字列 。) -
format()
フォーマット指定子%L
を使用quote_nullable()
と同等です 。
Like:format('%L', string_var)
-
concat()
通常、この目的には適していません。 ネストされた一重引用符と円記号をエスケープします。concat_ws()