Pregunta

Intentar insertar un carácter de escape en una tabla genera 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 solucionar esto?

¿Fue útil?

Solución

Parcialmente.El texto se inserta, pero aún se genera la advertencia.

Encontré una discusión que indicaba que el texto debía ir precedido de '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 aún 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');

Otros consejos

Fresco.

También encontré la documentación sobre la E:

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

PostgreSQL también acepta constantes de cadena de "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, p.E'foo'.(Cuando continúe una cadena de escape constante entre líneas, escriba E solo antes de la primera comilla inicial). Dentro de una cadena de escape, un carácter de barra invertida (\) comienza una secuencia de escape de barra invertida similar a C, en la que la combinación de barra invertida y el carácter siguiente ( s) representa un valor de byte especial.\b es un retroceso, \f es un avance de página, es una nueva línea, es un retorno de carro, es una tabulación.También se admiten \digits, donde dígitos representa un valor de byte 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 invertidas (\\).Además, se puede incluir una comilla simple en una cadena de escape escribiendo \', además de la forma normal de ''.

La advertencia se emite porque está utilizando barras invertidas en sus cadenas.Si desea evitar el mensaje, escriba este comando "set standard_conforming_strings=on;".Luego use "E" antes de su cadena, incluidas las barras invertidas que desea que postgresql interprete.

Me parece muy poco probable que Postgres trunque los datos al ingresarlos: los rechaza o los almacena tal cual.

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 0 1
milen=> select * from EscapeTest;
          text
------------------------
 This will be inserted
  This will not be
(1 row)

milen=>

Pregunta realmente estúpida:¿Está seguro de que la cadena se trunca y no simplemente se rompe en el salto de línea que especifica (y posiblemente no se muestra en su interfaz)?Es decir, ¿espera que el campo se muestre como

Esto se insertará n esto no será

o

Esto será insertado

esto no sera

Además, ¿qué interfaz estás usando?¿Es posible que algo en el camino se esté comiendo tus barras invertidas?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top