Letterlijke tekenreeksen
Enkele aanhalingstekens ontsnappen '
door ze te verdubbelen -> ''
is de standaard manier en werkt natuurlijk:
'user's log' -- incorrect syntax (unbalanced quote)
'user''s log'
Duidelijke enkele aanhalingstekens (ASCII / UTF-8 code 39), let wel, geen backticks `
, die geen speciaal doel hebben in Postgres (in tegenstelling tot bepaalde andere RDBMS) en geen dubbele aanhalingstekens "
, gebruikt voor identifiers.
In oude versies of als je nog steeds draait met standard_conforming_strings = off
of, in het algemeen, als u uw tekenreeks voorzet met E
om Posix escape-tekenreekssyntaxis te declareren , kunt u ook ontsnappen met de backslash \
:
E'user\'s log'
Backslash zelf wordt ontsnapt met een andere backslash. Maar dat heeft over het algemeen niet de voorkeur.
Als je te maken hebt met veel enkele aanhalingstekens of meerdere lagen van ontsnappingen, kun je voorkomen dat je de hel in PostgreSQL citeert met strings tussen dollar aanhalingstekens :
'escape '' with '''''
$$escape ' with ''$$
Om verwarring tussen dollaraanhalingstekens verder te voorkomen, voegt u een unieke token toe aan elk paar:
$token$escape ' with ''$token$
Die op een willekeurig aantal niveaus kan worden genest:
$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$
Let op als de $
karakter moet een speciale betekenis hebben in uw clientsoftware. Mogelijk moet u er bovendien aan ontsnappen. Dit is niet het geval met standaard PostgreSQL-clients zoals psql of pgAdmin.
Dat is allemaal erg handig voor het schrijven van plpgsql-functies of ad-hoc SQL-commando's. Het kan echter niet de noodzaak verlichten om voorbereide instructies of een andere methode te gebruiken om te beschermen tegen SQL-injectie in uw toepassing wanneer gebruikersinvoer mogelijk is. Het antwoord van @Craig heeft daar meer over. Meer details:
- SQL-injectie in Postgres-functies versus voorbereide zoekopdrachten
Waarden binnen Postgres
Bij het omgaan met waarden in de database zijn er een aantal handige functies om strings correct te citeren:
quote_literal()
ofquote_nullable()
- de laatste geeft de stringNULL
. af voor nulinvoer. (Er is ookquote_ident()
naar dubbele aanhalingstekens strings waar nodig om geldige SQL identifiers te krijgen .)format()
met de formaatspecificatie%L
is gelijk aanquote_nullable()
.
Vind ik leuk:format('%L', string_var)
ofconcat()
zijn meestal niet geschikt voor dit doel, omdat die niet ontsnap aan geneste enkele aanhalingstekens en backslashes.concat_ws()