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

PostgreSQLでパターンを照合しながら文字列をエスケープする方法

    _文字と%文字は、LIKEステートメントで文字通り一致するように引用符で囲む必要があり、それを回避する方法はありません。選択は、クライアント側またはサーバー側で行うことです(通常、SQL replace()を使用します。以下を参照してください)。また、一般的なケースで100%正しくするために、考慮すべきことがいくつかあります。

    デフォルトでは、_または%の前に使用する引用符は円記号(\)ですが、LIKE句の直後のESCAPE句で変更できます。いずれの場合も、引用符はパターン内で2回繰り返す必要があります。文字通り1文字として一致します。

    例:... WHERE field like 'john^%node1^^[email protected]%' ESCAPE '^'のようなWHEREフィールド john%node1 ^ [email protected]と一致します

    バックスラッシュのデフォルトの選択には問題があります。standard_conforming_stringsがオフの場合、他の目的ですでに使用されています(PG 9.1ではデフォルトでオンになっていますが、以前のバージョンはまだ広く使用されているため、これは考慮事項です)。

    また、LIKEワイルドカードの引用が、ユーザー入力インジェクションシナリオでクライアント側で行われる場合、に加えて 通常の文字列に-ユーザー入力ですでに必要な引用。

    go-pgsqlの例を見ると、変数に$ Nスタイルのプレースホルダーが使用されていることがわかります...したがって、これをなんらかの一般的な方法で記述しようとします。これは、ONまたはOFFの両方のstandard_conforming_stringsで機能し、サーバー側の置換を使用します。 [%_]、代替引用文字、引用文字の引用、およびSQLインジェクションの回避:

       db.Query("SELECT * from USERS where name like replace(replace(replace($1,'^','^^'),'%','^%'),'_','^_') ||'%' ESCAPE '^'",
         variable_user_input);
    


    1. SQLServerでのDateTimeのYYYY-MM-DD形式への変換

    2. MySQLのDOUBLEとDECIMAL

    3. Pl/pgsql関数のCOPYステートメントを使用して診断を取得する

    4. PostgreSQLのカーソルベースのレコード