Literales de cadena
Escapando de comillas simples '
duplicándolas ->''
es la forma estándar y funciona, por supuesto:
'user's log' -- incorrect syntax (unbalanced quote)
'user''s log'
En versiones anteriores o si todavía se ejecuta con standard_conforming_strings = off
o, en general, si antepone su cadena 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 diagonal inversa se escapa con otra barra diagonal inversa. 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 de dólares :
'escape '' with '''''
$$escape ' with ''$$
Para evitar aún más la confusión entre las cotizaciones en dólares, agregue un token único a cada par:
$token$escape ' with ''$token$
Que se puede anidar cualquier cantidad de niveles:
$token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$
Presta atención si el $
personaje debe tener un significado especial en el software de tu cliente. Es posible que tenga que escapar además. Este no es el caso con clientes estándar de PostgreSQL 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 proteger contra la inyección de SQL en su aplicación cuando es posible la entrada del usuario. La respuesta de @ Craig tiene más información al respecto. Más detalles:
Valores dentro de Postgres
Al tratar con valores dentro de la base de datos, hay un par de funciones útiles para citar cadenas correctamente:
quote_literal()
oquote_nullable()
- este último genera la cadena NULL
para una entrada nula. (También hay quote_ident()
que comillas dobles cadenas donde sea necesario para obtener SQL válidas identificadores .)
format()
con el especificador de formato %L
es equivalente a quote_nullable()
.
Me gusta:format('%L', string_var)
concat()
oconcat_ws()
normalmente no son buenas, ya que no escapan a comillas simples anidadas y barras diagonales inversas.