[解決済み] PostgreSQLで一重引用符で囲まれたテキストを挿入する
質問
私はテーブルを持っています
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内部の値
データベース内で値を扱う場合、文字列を適切に引用するための便利な関数がいくつかあります。
-
quote_literal()
またはquote_nullable()
- を出力し、後者は文字列NULL
はヌル入力の場合。(またquote_ident()
から ダブルクオート 有効なSQLを取得するために必要な文字列 識別子 .) -
format()
というフォーマット指定子で%L
と同じです。quote_nullable()
.
のように。format('%L', string_var)
-
<ストライク
concat()
または <ストライクconcat_ws()
は、一般的にこの目的には適していません。 ない は、ネストしたシングルクォートとバックスラッシュをエスケープします。
関連
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] PostgreSQLの場合。PostgreSQLのテーブルを表示する
-
[解決済み] PostgreSQLの "DESCRIBE TABLE"
-
[解決済み] PostgreSQL コマンドラインユーティリティ: psql を終了する方法
-
[解決済み] PostgreSQLのユーザーパスワードを変更する方法を教えてください。
-
[解決済み] どのバージョンのPostgreSQLを使用していますか?
-
[解決済み] INNER JOIN ON vs WHERE句
-
[解決済み] MySQLでシングルクォート、ダブルクォート、バックスティックを使用する場合
-
[解決済み] コマンドライン引数でPostgreSQLの.sqlファイルを実行する
-
[解決済み] SQLite - UPSERT *not* INSERT or REPLACE
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MHAクラスタエラーサマリーの構築
-
[解決済み] SQL Serverで実行中の合計を計算する
-
[解決済み] MySQLの「スキーマの作成」と「データベースの作成」 - 違いはあるのか?
-
[解決済み] INNER JOINよりもCROSS APPLYを使用すべきなのはどのような場合ですか?
-
[解決済み] SQL Serverで、指定したテーブルを参照しているすべての外部キーを一覧表示するにはどうすればよいですか?
-
[解決済み] SQL Server における DateTime2 と DateTime の比較
-
[解決済み] 文字列の一部をUPDATEおよびREPLACEする。
-
[解決済み] Count()で条件を指定することは可能ですか?
-
[解決済み] 複数の列に対してSELECT DISTINCTする方法(またはできる方法)は?
-
[解決済み] Postgres でサブクエリを使用してテーブルの行を更新する