Aquí podría ser tu PUBLICIDAD


Literales de cadenas y caracteres de escape en postgresql

votos
95

Intentar insertar un carácter de escape en una tabla da como resultado una advertencia.

Por ejemplo:

create table EscapeTest (text varchar(50));

insert into EscapeTest (text) values ('This is the first part \n And this is the second');

Produce la advertencia:

WARNING:  nonstandard use of escape in a string literal

( Usando PSQL 8.2 )

Alguien sabe cómo evitar esto?

Publicado el 04/08/2008 a las 02:00
fuente por usuario rjohnston
En otros idiomas...        العربية       

5 respuestas

votos
104

Parcialmente. El texto está insertado, pero la advertencia todavía se genera.

Encontré una discusión que indicaba que el texto debía ir precedido por 'E', como tal:

insert into EscapeTest (text) values (E'This is the first part \n And this is the second');

Esto suprimió la advertencia, pero el texto todavía no se devolvía correctamente. Cuando agregué la barra adicional como sugirió Michael, funcionó.

Como tal:

insert into EscapeTest (text) values (E'This is the first part \\n And this is the second');
Respondida el 04/08/2008 a las 02:07
fuente por usuario rjohnston


Aquí podría ser tu PUBLICIDAD


votos
32

Guay.

También encontré la documentación con respecto a E:

http://www.postgresql.org/docs/8.3/interactive/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS

PostgreSQL también acepta constantes de cadena "escape", que son una extensión del estándar SQL. Una constante de cadena de escape se especifica escribiendo la letra E (mayúscula o minúscula) justo antes de la comilla simple de apertura, por ej. E'foo '. (Al continuar una cadena de escape constante entre líneas, escriba E solo antes de la primera comilla de apertura). Dentro de una cadena de escape, una barra invertida (\) comienza una secuencia de escape de barra invertida similar a C, en la cual la combinación de barra invertida y el siguiente s) representa un valor de byte especial. \ b es un retroceso, \ f es un avance de formulario, \ n es una nueva línea, \ r es un retorno de carro, \ t es una pestaña. También se admiten \ dígitos, donde los dígitos representan un valor de octeto octal, y \ xhexdigits, donde hexdigits representa un valor de byte hexadecimal. (Es su responsabilidad que las secuencias de bytes que cree sean caracteres válidos en la codificación del juego de caracteres del servidor). Cualquier otro carácter que siga a una barra invertida se toma literalmente. Por lo tanto, para incluir un carácter de barra invertida, escriba dos barras diagonales inversas (\\). Además, se puede incluir una comilla simple en una cadena de escape al escribir \ ', además de la forma normal de' '.

Respondida el 04/08/2008 a las 02:14
fuente por usuario Michael Stum

votos
5

La advertencia se emite dado que está utilizando barras invertidas en sus cadenas. Si se quiere evitar el mensaje, escriba este comando "set standard_conforming_strings = en;". A continuación, utilice "E" antes de su cadena que incluye barras invertidas que desee PostgreSQL a integrantes interpretan.

Respondida el 17/02/2010 a las 12:51
fuente por usuario eppesuig

votos
3

Me parece muy poco probable que Postgres trunque sus datos en la entrada, ya sea que lo rechace o lo almacene como está.

milen@dev:~$ psql
Welcome to psql 8.2.7, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

milen=> create table EscapeTest (text varchar(50));
CREATE TABLE
milen=> insert into EscapeTest (text) values ('This will be inserted \n This will not be');
WARNING:  nonstandard use of escape in a string literal
LINE 1: insert into EscapeTest (text) values ('This will be inserted...
                                              ^
HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'.
INSERT IGNORE  0 1
milen=> select * from EscapeTest;
          text
------------------------
 This will be inserted
  This will not be
(1 row)

milen=>
Respondida el 19/09/2008 a las 08:24
fuente por usuario Milen A. Radev

votos
2

Pregunta realmente estúpida: ¿Estás seguro de que la cadena está siendo truncada, y no solo rota en el salto de línea que especifiques (y posiblemente no aparezca en tu interfaz)? Es decir, ¿espera que el campo se muestre como

Esto se insertará \ n Esto no será

o

Esto será insertado

Esto no será

Además, ¿qué interfaz estás usando? ¿Es posible que algo en el camino te esté comiendo las pestañas?

Respondida el 16/09/2008 a las 02:26
fuente por usuario nissepelle