sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLで一重引用符で囲まれたテキストを挿入する

    文字列リテラル

    一重引用符のエスケープ' それらを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() 通常、この目的には適していません。 ネストされた一重引用符と円記号をエスケープします。


    1. 使用されているMySQL構成ファイルを特定します

    2. MySQLの各グループで最後のレコードを取得する方法

    3. 一般的なSQLiteの問題を解決するのに役立つ方法はありますか?

    4. PHPとMySQLのファイルをアップロードおよびダウンロードする方法