string - simple - Literales de cadena y caracteres de escape en postgresql
insert text postgresql (5)
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?
Bueno.
También encontré la documentación sobre el 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. Se especifica una constante de cadena de escape escribiendo la letra E (mayúscula o minúscula) justo antes de la comilla simple de apertura, por ejemplo, E''foo ''. (Al continuar una cadena de escape constante a través de las líneas, escriba E solo antes de la primera cita de apertura). Dentro de una cadena de escape, un carácter de barra diagonal inversa (/) comienza una secuencia de escape de barra diagonal inversa tipo C, en la que la combinación de barra diagonal inversa y el siguiente carácter ( 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 / digits, donde digits 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 diagonal inversa se toma literalmente. Por lo tanto, para incluir un carácter de barra diagonal inversa, escriba dos barras diagonales inversas (//). Además, se puede incluir una comilla simple en una cadena de escape escribiendo / '', además de la forma normal de'' ''.
Creo que es muy poco probable que Postgres trunque sus datos en la entrada, ya sea que los rechace o los almacene como están.
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=>
La advertencia se emite ya que 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 incluyendo barras invertidas que desea que postgresql integre.
Parcialmente. El texto se inserta, pero la advertencia aún se genera.
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 todavía no se devolvía correctamente. Cuando agregué la barra adicional como Michael sugirió, funcionó.
Como tal:
insert into EscapeTest (text) values (E''This is the first part //n And this is the second'');
Pregunta realmente estúpida: ¿está seguro de que la cadena se está truncando y no solo rota en el salto de línea que especifique (y posiblemente no se muestre en su interfaz)? Es decir, ¿espera que el campo se muestre como
Esto será insertado / 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 te esté comiendo las barras invertidas?