sql >> Base de Datos >  >> RDS >> PostgreSQL

Insertar texto con comillas simples en PostgreSQL

Literales de cadena

Escapando comillas simples ' doblándolos -> '' es la forma estándar y funciona, por supuesto:

'user's log'     -- incorrect syntax (unbalanced quote)
'user''s log'

Comillas simples simples (código ASCII/UTF-8 39), eso sí, no acentos graves ` , que no tienen un propósito especial en Postgres (a diferencia de otros RDBMS) y no tienen comillas dobles " , usado para identificadores.

En versiones antiguas o si aún ejecuta con standard_conforming_strings = off o, en general, si antepone su cadena con E para declarar la sintaxis de cadena de escape de Posix , también puede escapar con la barra invertida \ :

E'user\'s log'

La barra invertida se escapa con otra barra invertida. Pero eso generalmente no es preferible.
Si tiene que lidiar con muchas comillas simples o múltiples capas de escape, puede evitar citar el infierno en PostgreSQL con cadenas entre comillas de dólar :

'escape '' with '''''
$$escape ' with ''$$

Para evitar aún más la confusión entre las cotizaciones del dólar, agregue un token único a cada par:

$token$escape ' with ''$token$

Que se puede anidar en cualquier número de niveles:

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

Preste atención si el $ El carácter debe tener un significado especial en el software de su cliente. Puede que tenga que escapar de ella, además. Este no es el caso con clientes PostgreSQL estándar como psql o pgAdmin.

Todo eso es muy útil para escribir funciones plpgsql o comandos SQL ad-hoc. Sin embargo, no puede aliviar la necesidad de usar declaraciones preparadas o algún otro método para protegerse contra la inyección SQL en su aplicación cuando la entrada del usuario es posible. La respuesta de @Craig tiene más sobre eso. Más detalles:

  • Inyección de SQL en funciones de Postgres vs consultas preparadas

Valores dentro de Postgres

Cuando se trata de valores dentro de la base de datos, hay un par de funciones útiles para citar cadenas correctamente:

  • quote_literal() o quote_nullable() - este último genera la cadena NULL para entrada nula. (También hay quote_ident() a comillas dobles cadenas donde sea necesario para obtener identificadores de SQL válidos .)
  • format() con el especificador de formato %L es equivalente a quote_nullable() .
    Me gusta:format('%L', string_var)
  • concat() o concat_ws() normalmente no son buenos para este propósito ya que aquellos no escape de comillas simples anidadas y barras invertidas.