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

Inserisci testo con virgolette singole in PostgreSQL

Stringa letterali

virgolette singole di escape ' raddoppiandoli -> '' è il modo standard e funziona ovviamente:

'user's log'     -- incorrect syntax (unbalanced quote)
'user''s log'

Virgolette semplici (codice ASCII / UTF-8 39), attenzione, non backtick ` , che non hanno uno scopo speciale in Postgres (a differenza di altri RDBMS) e non virgolette " , utilizzato per gli identificatori.

Nelle vecchie versioni o se esegui ancora con standard_conforming_strings = off o, in generale, se anteponi la tua stringa con E per dichiarare la sintassi della stringa di escape Posix , puoi anche eseguire l'escape con la barra rovesciata \ :

E'user\'s log'

La barra rovesciata stessa viene evitata con un'altra barra rovesciata. Ma in genere non è preferibile.
Se devi gestire molte virgolette singole o più livelli di escape, puoi evitare di citare l'inferno in PostgreSQL con stringhe tra virgolette in dollari :

'escape '' with '''''
$$escape ' with ''$$

Per evitare ulteriore confusione tra le quotazioni in dollari, aggiungi un token univoco a ciascuna coppia:

$token$escape ' with ''$token$

Che può essere nidificato a qualsiasi numero di livelli:

$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$

Presta attenzione se il $ carattere dovrebbe avere un significato speciale nel software client. Potrebbe essere necessario scappare in aggiunta. Questo non è il caso dei client PostgreSQL standard come psql o pgAdmin.

Tutto ciò è molto utile per scrivere funzioni plpgsql o comandi SQL ad hoc. Tuttavia, non può alleviare la necessità di utilizzare istruzioni preparate o qualche altro metodo per proteggersi dall'iniezione di SQL nell'applicazione quando è possibile l'input dell'utente. La risposta di @Craig ha di più su questo. Maggiori dettagli:

  • Iniezione SQL nelle funzioni di Postgres rispetto alle query preparate

Valori all'interno di Postgres

Quando si tratta di valori all'interno del database, ci sono un paio di funzioni utili per citare correttamente le stringhe:

  • quote_literal() o quote_nullable() - quest'ultimo restituisce la stringa NULL per input nullo. (C'è anche quote_ident() doppia virgolette stringhe dove necessario per ottenere identificatori SQL validi .)
  • format() con l'identificatore di formato %L è equivalente a quote_nullable() .
    Come:format('%L', string_var)
  • concat() o concat_ws() in genere non vanno bene per questo scopo in quanto quelli non sfuggire a virgolette singole e barre inverse nidificate.