Littéraux de chaîne
Échapper aux guillemets simples '
en les doublant -> ''
est la méthode standard et fonctionne bien sûr:
'user's log' -- incorrect syntax (unbalanced quote)
'user''s log'
Dans les anciennes versions ou si vous exécutez toujours avec standard_conforming_strings = off
ou, généralement, si vous ajoutez votre chaîne à E
pour déclarer la syntaxe de chaîne d'échappement Posix , vous pouvez également vous échapper avec la barre oblique inverse \
:
E'user\'s log'
La barre oblique inverse elle-même est échappée avec une autre barre oblique inverse. Mais ce n'est généralement pas préférable.
Si vous devez gérer de nombreux guillemets simples ou plusieurs couches d'échappement, vous pouvez éviter de citer l'enfer dans PostgreSQL avec des chaînes entre guillemets :
'escape '' with '''''
$$escape ' with ''$$
Pour éviter davantage la confusion entre les cotations en dollars, ajoutez un jeton unique à chaque paire:
$token$escape ' with ''$token$
Qui peuvent être imbriqués dans n'importe quel nombre de niveaux:
$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$
Faites attention si le $
personnage doit avoir une signification particulière dans votre logiciel client. Vous devrez peut-être y échapper en plus. Ce n'est pas le cas avec les clients PostgreSQL standard comme psql ou pgAdmin.
Tout cela est très utile pour écrire des fonctions plpgsql ou des commandes SQL ad hoc. Cependant, cela ne peut pas réduire le besoin d'utiliser des instructions préparées ou une autre méthode pour se protéger contre l'injection SQL dans votre application lorsque l'entrée utilisateur est possible. @ La réponse de Craig en contient plus. Plus de détails:
Valeurs à l'intérieur de Postgres
Lorsque vous traitez des valeurs à l'intérieur de la base de données, il existe quelques fonctions utiles pour citer correctement les chaînes:
quote_literal()
ouquote_nullable()
- ce dernier sort la chaîne NULL
pour une entrée nulle. (Il y a aussi quote_ident()
de guillemets doubles cordes si nécessaire pour obtenir valides SQL identifiants .)
format()
avec le spécificateur de format %L
est équivalent à quote_nullable()
.
Comme:format('%L', string_var)
concat()
ou neconcat_ws()
sont généralement pas bons car ceux-ci n'échappent pas aux guillemets simples et aux barres obliques inverses imbriqués.