PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come eseguire l'escape della stringa durante la corrispondenza del modello in PostgreSQL

I caratteri _ e % devono essere citati per essere abbinati letteralmente in un'istruzione LIKE, non c'è modo di aggirarlo. La scelta consiste nel farlo lato client o lato server (in genere utilizzando SQL replace(), vedi sotto). Inoltre, per farlo al 100% nel caso generale, ci sono alcune cose da considerare.

Per impostazione predefinita, il carattere di virgoletta da utilizzare prima di _ o % è la barra rovesciata (\), ma può essere modificato con una clausola ESCAPE immediatamente successiva alla clausola LIKE. In ogni caso, il carattere di virgoletta deve essere ripetuto due volte nello schema per essere abbinato letteralmente come un carattere.

Esempio:... WHERE field like 'john^%node1^^[email protected]%' ESCAPE '^' corrisponderebbe a john%node1^[email protected] seguito da qualsiasi cosa.

C'è un problema con la scelta predefinita della barra rovesciata:è già usata per altri scopi quando standard_conforming_strings è OFF (PG 9.1 lo ha attivato per impostazione predefinita, ma le versioni precedenti sono ancora ampiamente utilizzate, questo è un punto da considerare).

Inoltre, se la quotazione per il carattere jolly LIKE viene eseguita lato client in uno scenario di iniezione dell'input utente, viene oltre a alle normali virgolette di stringa già necessarie all'input dell'utente.

Uno sguardo a un esempio go-pgsql dice che utilizza segnaposto in stile $N per le variabili... Quindi ecco un tentativo di scriverlo in un modo in qualche modo generico:funziona con stringhe conformi allo standard sia ON che OFF, usa la sostituzione lato server di [%_], un carattere di virgoletta alternativo, virgolette del carattere di virgoletta ed evita l'iniezione di sql:

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