PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Insérer du texte avec des guillemets simples dans PostgreSQL

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'

Des guillemets simples (ASCII / UTF-8 code 39), attention, pas des backticks ` , qui n'ont pas de but particulier dans Postgres (contrairement à certains autres SGBDR) et ne sont pas entre guillemets doubles " , utilisé pour les identifiants.

Dans les anciennes versions ou si vous exécutez toujours avec standard_conforming_strings = off ou, généralement, si vous ajoutez E à votre chaîne pour déclarer la syntaxe de chaîne d'échappement Posix , vous pouvez également échapper avec la barre oblique inverse \ :

E'user\'s log'

La barre oblique inverse elle-même est échappée par 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 en dollars :

'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 peut être imbriqué sur n'importe quel nombre de niveaux :

$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$

Faites attention si le $ Le caractère 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, il ne peut pas atténuer 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 de l'utilisateur est possible. La réponse de @ Craig a plus à ce sujet. Plus de détails :

  • Injection SQL dans les fonctions Postgres vs requêtes préparées

Valeurs dans Postgres

Lorsqu'il s'agit de valeurs à l'intérieur de la base de données, il existe quelques fonctions utiles pour citer correctement les chaînes :

  • quote_literal() ou quote_nullable() - ce dernier affiche la chaîne NULL pour une entrée nulle. (Il y a aussi quote_ident() à guillemets doubles chaînes si nécessaire pour obtenir des identifiants SQL valides .)
  • format() avec le spécificateur de format %L est équivalent à quote_nullable() .
    Comme :format('%L', string_var)
  • concat() ou concat_ws() ne sont généralement pas bons à cette fin car ceux-ci ne le font pas échapper les guillemets simples imbriqués et les barres obliques inverses.