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

Indsæt tekst med enkelte anførselstegn i PostgreSQL

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() eller quote_nullable() - sidstnævnte udsender strengen NULL 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 til quote_nullable() .
    Ligesom:format('%L', string_var)
  • concat() eller concat_ws() er typisk ikke gode til dette formål, da de ikke gør escape indlejrede enkelte anførselstegn og omvendte skråstreg.


  1. Henter linket liste i MySQL-database

  2. SELECT SUM returnerer en række, når der ikke er nogen poster

  3. T-SQL - Indsæt data i overordnede og underordnede tabeller

  4. Postgres tips og tricks