una simple reemplazar into insertar dobles concatenar como comillas comilla postgresql insert special-characters quotes

reemplazar - Insertar texto con comillas simples en PostgreSQL



insertar comillas dobles en sql (6)

En postgresql, si desea insertar valores con '' en él, para esto tiene que dar más ''

insert into test values (1,''user''''s log''); insert into test values (2,''''''my users''''''); insert into test values (3,''customer''''s'');

Tengo una test(id,name) mesa test(id,name) .

Necesito insertar valores como: user''s log , ''my user'' , customer''s .

insert into test values (1,''user''s log''); insert into test values (2,''''my users''''); insert into test values (3,''customer''s'');

Recibo un error si ejecuto alguna de las declaraciones anteriores.

Si hay algún método para hacerlo correctamente, por favor comparta. No quiero ninguna declaración preparada.

¿Es posible utilizar el mecanismo de escape de SQL?


Escapar 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 ejecuta con standard_conforming_strings = off o, en general, si antepone su cadena con E para declarar la sintaxis de la cadena de escape de Posix , también puede escapar con la barra invertida / :

E''user/'s log''

Pero eso generalmente no es preferible.
Si tiene que lidiar con muchas comillas simples o varias capas de escape, puede evitar citar el infierno en PostgreSQL con cadenas cotizadas en dólares :

''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 puede ser anidado en cualquier número de niveles:

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

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

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 de SQL en su aplicación cuando es posible la entrada del usuario. La respuesta de @ Craig tiene más sobre eso. Más detalles:


Esto es tan malo, porque su pregunta implica que probablemente tenga vacíos de inyección de SQL en su aplicación.

Debería estar utilizando instrucciones parametrizadas. Para Java, use PreparedStatement con marcadores de posición . Usted dice que no quiere usar declaraciones parametrizadas, pero no explica por qué , y francamente tiene que ser una muy buena razón para no usarlas porque son la forma más sencilla y segura de solucionar el problema que está intentando. resolver.

Consulte Prevención de la inyección SQL en Java . No seas la próxima víctima de Bobby .

No hay una función pública en PgJDBC para citar cadenas y escapar. Eso es en parte porque puede parecer una buena idea.

Hay funciones de quote_literal incorporadas quote_literal y quote_ident en PostgreSQL, pero son para funciones PL/PgSQL que utilizan EXECUTE . Hoy en día, quote_literal está en gran parte obsoleto por EXECUTE ... USING , que es la versión parametrizada , porque es más segura y fácil . No puede usarlos para el propósito que explica aquí, porque son funciones del lado del servidor.

Imagine lo que sucede si obtiene el valor '');DROP SCHEMA public;-- de un usuario malintencionado. Usted produciría:

insert into test values (1,'''');DROP SCHEMA public;--'');

que se descompone en dos afirmaciones y un comentario que se ignora:

insert into test values (1,''''); DROP SCHEMA public; --'');

Vaya, ahí va tu base de datos.


Puedes usar la función postrgesql chr (int):

insert into test values (2,''|| chr(39)||''my users''||chr(39)||'');