_文字と%文字は、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);