Literales de cadena y caracteres de escape en postgresql


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

Author: Damjan Pavlica, 2008-08-04

5 answers

Parcialmente. El texto se inserta, pero la advertencia se sigue generando.

Encontré una discusión que indicaba que el texto debía ser 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 estaba siendo devuelto 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');
 109
Author: rjohnston,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-04 23:08:11

Genial.

También encontré la documentación con respecto a la 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 inicial, por ejemplo, E 'foo'. (Al continuar una constante de cadena de escape a través de líneas, escriba E solo antes de la primera cita de apertura.) 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 los caracteres siguientes representan un valor de byte especial. \b es un retroceso, \f es un avance de forma, \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 octal de byte, y \xhexdigits, donde hexdigits representa un valor hexadecimal de byte. (Es su responsabilidad que las secuencias de bytes que cree son caracteres válidos en la codificación del conjunto 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 ".

 32
Author: Michael Stum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-04 01:14:57

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 intreprete.

 5
Author: eppesuig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-16 23:51:23

Me parece muy poco probable que Postgres trunque sus datos en la entrada - o bien los rechaza o los almacena 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=>
 3
Author: Milen A. Radev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-27 16:04:29

Pregunta realmente estúpida: ¿Está seguro de que la cadena está siendo truncada, 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 se insertará \n Esto no be

O

Esto se insertará

Esto no será

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

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-16 13:26:04