Letteral streng
Undgå enkelte anførselstegn '
ved at fordoble dem -> ''
er standardmåden og fungerer selvfølgelig:
'user's log' -- incorrect syntax (unbalanced quote)
'user''s log'
Almindelige anførselstegn (ASCII / UTF-8 kode 39), vel at mærke, ikke backticks `
, som ikke har noget særligt formål i Postgres (i modsætning til visse andre RDBMS) og ikke dobbelte anførselstegn "
, bruges til identifikatorer.
I gamle versioner eller hvis du stadig kører med standard_conforming_strings = off
eller generelt, hvis du sætter E
foran din streng at erklære Posix escape-strengsyntaks , kan du også escape med omvendt skråstreg \
:
E'user\'s log'
Selve omvendt skråstreg undslippes med endnu en skråstreg. Men det er generelt ikke at foretrække.
Hvis du har at gøre med mange enkelte citater eller flere lag af undslippe, kan du undgå at citere helvede i PostgreSQL med dollar-citerede strenge :
'escape '' with '''''
$$escape ' with ''$$
For yderligere at undgå forvirring mellem dollar-citater, tilføje et unikt token til hvert par:
$token$escape ' with ''$token$
Som kan indlejres et vilkårligt antal niveauer:
$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$
Vær opmærksom på, hvis $
karakter skal have særlig betydning i din klientsoftware. Du skal muligvis undslippe det derudover. Dette er ikke tilfældet med standard PostgreSQL-klienter som psql eller pgAdmin.
Det er alt sammen meget nyttigt til at skrive plpgsql-funktioner eller ad-hoc SQL-kommandoer. Det kan dog ikke afhjælpe behovet for at bruge forberedte sætninger eller en anden metode til at sikre mod SQL-injektion i din applikation, når brugerinput er muligt. @Craigs svar har mere om det. Flere detaljer:
- SQL-injektion i Postgres-funktioner kontra forberedte forespørgsler
Værdier i Postgres
Når du beskæftiger dig med værdier inde i databasen, er der et par nyttige funktioner til at citere strenge korrekt:
quote_literal()
ellerquote_nullable()
- sidstnævnte udsender strengenNULL
for nul input. (Der er ogsåquote_ident()
til dobbelt citat strenge, hvor det er nødvendigt for at få gyldige SQL identifikatorer .)format()
med formatspecifikationen%L
svarer tilquote_nullable()
.
Ligesom:format('%L', string_var)
ellerconcat()
er typisk ikke gode til dette formål, da de ikke gør escape indlejrede enkelte anførselstegn og omvendte skråstreg.concat_ws()