1. ホーム
  2. sql

[解決済み] PostgreSQLで一重引用符で囲まれたテキストを挿入する

2022-03-16 13:20:57

質問

私はテーブルを持っています 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エスケープ機構を使用して可能ですか?

どのように解決するのですか?

文字列リテラル

シングルクォートのエスケープ ' を二重にすることで、-> '' が標準的な方法であり、もちろん機能します。

'user's log'     -- incorrect syntax (unbalanced quote)
'user''s log'

バックティックではなく、プレーンなシングルクォート(ASCII / UTF-8 code 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インジェクションから保護する必要性を緩和することはできません。 クレイグの回答 にはその詳細が書かれています。詳しくはこちら

Postgre内部の値

データベース内で値を扱う場合、文字列を適切に引用するための便利な関数がいくつかあります。