テーブルがありますtest(id,name)
。
user's log
、、'my user'
などの値を挿入する必要がありますcustomer's
。
insert into test values (1,'user's log');
insert into test values (2,''my users'');
insert into test values (3,'customer's');
上記のいずれかのステートメントを実行するとエラーが発生します。
これを正しく行う方法があれば、ぜひ共有してください。準備されたステートメントは必要ありません。
SQL エスケープ メカニズムを使用することは可能ですか?
ベストアンサー1
文字列リテラル
一重引用符を'
二重にしてエスケープする → は''
標準的な方法であり、もちろん機能します。
'user's log'
-- incorrect syntax (unbalanced quote)
'user''s log'
プレーンな一重引用符 (ASCII / UTF-8 コード 39) であり、バックティックではありません。バックティックは、Postgres では特別な目的はありません (他の特定の RDBMS とは異なります)。また、識別子に使用される`
二重引用符でもありません。"
古いバージョンの場合、またはまだstandard_conforming_strings = off
または、一般的には、文字列の先頭に を付けてPosix エスケープ文字列構文E
を宣言すると、バックスラッシュでエスケープすることもできます。\
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 クライアントには当てはまりません。
これらはすべて、PL/pgSQL 関数やアドホック SQL コマンドを記述するのに非常に便利です。ただし、ユーザー入力が可能な場合に、アプリケーションで SQL インジェクションを防ぐために準備済みステートメントやその他の方法を使用する必要性を軽減することはできません。@クレイグの回答詳細は以下をご覧ください。
Postgres内の値
データベース内の値を扱う場合、文字列を適切に引用符で囲むための便利な関数がいくつかあります。
quote_literal()
またはquote_nullable()
- 後者は、null入力に対して引用符で囲まれていない文字列を出力しますNULL
。quote_ident()
有効な SQL識別子を取得するために必要な場所で文字列を二重引用符で囲みます。format()
書式指定子付き%L
の は と同等ですquote_nullable()
。
例:format('%L', string_var)
-
concat()
concat_ws()