Litterals strängar
Escapende enstaka citattecken '
genom att dubbla dem -> ''
är standardsättet och fungerar naturligtvis:
'user's log' -- incorrect syntax (unbalanced quote)
'user''s log'
Enkla citattecken (ASCII / UTF-8 kod 39), märk väl, inte backticks `
, som inte har något speciellt syfte i Postgres (till skillnad från vissa andra RDBMS) och inte dubbla citattecken "
, används för identifierare.
I gamla versioner eller om du fortfarande kör med standard_conforming_strings = off
eller, i allmänhet, om du lägger E
före din sträng för att deklarera Posix escape-strängsyntax , kan du också escape med omvänt snedstreck \
:
E'user\'s log'
Själva snedstrecket undviks med ytterligare ett snedstreck. Men det är i allmänhet inte att föredra.
Om du har att göra med många enstaka citat eller flera lager av flykt, kan du undvika att citera helvetet i PostgreSQL med dollar-citerade strängar :
'escape '' with '''''
$$escape ' with ''$$
För att ytterligare undvika förvirring mellan dollarkurser, lägg till en unik token till varje par:
$token$escape ' with ''$token$
Som kan kapslas valfritt antal nivåer:
$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$
Var uppmärksam på om $
karaktär bör ha speciell betydelse i din klientprogramvara. Du kan behöva fly det dessutom. Detta är inte fallet med vanliga PostgreSQL-klienter som psql eller pgAdmin.
Det är mycket användbart för att skriva plpgsql-funktioner eller ad-hoc SQL-kommandon. Det kan dock inte lindra behovet av att använda förberedda satser eller någon annan metod för att skydda mot SQL-injektion i din applikation när användarinmatning är möjlig. @Craigs svar har mer om det. Mer information:
- SQL-injektion i Postgres-funktioner kontra förberedda frågor
Värden i Postgres
När man hanterar värden i databasen finns det ett par användbara funktioner för att citera strängar korrekt:
quote_literal()
ellerquote_nullable()
- den senare matar ut strängenNULL
för nollinmatning. (Det finns ocksåquote_ident()
till dubbelcitattecken strängar där det behövs för att få giltiga SQL identifierare .)format()
med formatspecifikationen%L
motsvararquote_nullable()
.
Som:format('%L', string_var)
ellerconcat()
är vanligtvis inte bra för detta ändamål eftersom de inte gör det undvik kapslade enstaka citattecken och snedstreck.concat_ws()