Letterali a corda
Sfuggire alle virgolette singole '
raddoppiandole -> ''
è il modo standard e funziona ovviamente:
'user's log' -- incorrect syntax (unbalanced quote)
'user''s log'
Nelle versioni precedenti o se si esegue ancora con standard_conforming_strings = off
o, in genere, se si antepone la stringa E
per dichiarare la sintassi della stringa di escape Posix , è possibile anche eseguire la escape con la barra rovesciata \
:
E'user\'s log'
La stessa barra rovesciata viene salvata con un'altra barra rovesciata. Ma questo non è generalmente preferibile.
Se devi affrontare molte virgolette singole o più livelli di escape, puoi evitare di citare l'inferno in PostgreSQL con stringhe tra virgolette :
'escape '' with '''''
$$escape ' with ''$$
Per evitare ulteriore confusione tra le virgolette, aggiungi un token univoco a ciascuna coppia:
$token$escape ' with ''$token$
Che può essere nidificato in qualsiasi numero di livelli:
$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$
Fai attenzione se il $
personaggio deve avere un significato speciale nel tuo software client. Potrebbe essere necessario scappare in aggiunta. Questo non è il caso dei client PostgreSQL standard come psql o pgAdmin.
Ciò è molto utile per scrivere funzioni plpgsql o comandi SQL ad hoc. Tuttavia, non può alleviare la necessità di utilizzare istruzioni preparate o altri metodi per salvaguardare dall'iniezione SQL nell'applicazione quando è possibile l'input dell'utente. La risposta di @ Craig ha di più su questo. Più dettagli:
Valori all'interno di Postgres
Quando si hanno a che fare con valori all'interno del database, ci sono un paio di utili funzioni per citare correttamente le stringhe:
quote_literal()
oppurequote_nullable()
- quest'ultimo genera la stringa NULL
per input null. (È inoltre necessario quote_ident()
fare una virgoletta doppia tra parentesi quando necessario per ottenere identificatori SQL validi .)
format()
con l'identificatore di formato %L
equivale a quote_nullable()
.
Piace:format('%L', string_var)
concat()
o inconcat_ws()
genere non vanno bene perché non sfuggono alle virgolette singole singole e alle barre rovesciate.