sql >> Databasteknik >  >> RDS >> PostgreSQL

Infoga text med enstaka citattecken i PostgreSQL

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() eller quote_nullable() - den senare matar ut strängen NULL 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 motsvarar quote_nullable() .
    Som:format('%L', string_var)
  • concat() eller concat_ws() är vanligtvis inte bra för detta ändamål eftersom de inte gör det undvik kapslade enstaka citattecken och snedstreck.


  1. Oracle DateTime i Where-klausul?

  2. Hur exporterar jag frågeresultat till csv i Oracle SQL Developer?

  3. Hur SID skiljer sig från tjänstens namn i Oracle tnsnames.ora

  4. Vad är en frågeavvikare och hur man åtgärdar det