2008-08-04 76 views
91

Al intentar insertar un carácter de escape en una tabla, aparece una advertencia.Literales de cadena y caracteres de escape en postgresql

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 

(El uso de PSQL 8.2)

Alguien sabe cómo conseguir alrededor de esto?

Respuesta

104

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

encontré una discusión que indica el texto debía ser precedida por 'E', tales como:

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

Esto suprime la advertencia, pero el texto fue todavía no devueltas 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'); 
+5

Tenga en cuenta que en PostgreSQL 9.0 E'testing \\ x20double-slash 'se evaluará como' testing \\ x20double-slash ', por lo que solo el enfoque de una sola barra funciona para los literales de estilo E'string' – Alexander

+2

Para PostgreSQL 9.2 ver: http : //www.postgresql.org/docs/9.2/interactive/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE – Pitt

+0

nota 'psql \ copy': encontré que' E '\ n'' fue escrito para presentar como ''\ n'' en lugar de como una nueva línea cuando lo utilicé en el argumento de consulta al meta-comando' \ copy' de psql. – Stew

32

fresca.

También encontré la documentación relativa a la E:

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

PostgreSQL también acepta "escape" constantes de cadena, que son una extensión del estándar SQL. Una constante de cadena de escape se especifica al escribir la letra E (mayúscula o minúscula) justo antes de la comilla simple de apertura, p. 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 que 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' '.

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 se muestre en tu interfaz)?Es decir, qué se puede esperar del campo para mostrar como

Esto se inserta \ n Esto no será

o

Esto se inserta

Esta voluntad no sea

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

+1

esto me pasó a mí. El texto se estaba insertando en un cuadro de texto, se veía la fuente, y efectivamente, había una cita y todo el texto estaba presente, simplemente no visible – roberthuttinger

3

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

[email protected]:~$ 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=> 
+0

Por favor, pruebe el caso de prueba que di y lo verá por usted mismo. – rjohnston

+0

Interesante, parece que el problema estaba en el controlador JDBC porque el texto que salía de la base de datos se truncó definitivamente ... – rjohnston

+2

Postgres * no * trunca los datos de entrada en algunas situaciones muy específicas. Por ejemplo, una columna 'character variation (4)' dada la entrada "test" (dos espacios después de la palabra, 6 caracteres) truncará los espacios y almacenará el valor "test". Como regla general, sin embargo, puede suponer que Postgres generará errores en lugar de truncar sus datos. – Bryson

5

La advertencia se emite porque está utilizando barras diagonales inversas en las cuerdas. Si desea evitar el mensaje, escriba este comando "set standard_conforming_strings = on;". Luego usa "E" antes de tu cadena, incluidas las barras invertidas que quieras postgresql para interpretar.

+1

No realmente. Si tengo standard_conforming_strings = on y ejecuto el comando '\ copy xxxxxxxxxxx FROM /support01/db/data/xxxxxxxxx_7F.txt DELIMITER AS E '\ x7f'', obtengo' error de análisis en "' \ x7f '" '. Si tengo el standard_conforming_strings = apagado; y use el mismo comando anterior sin la E y las comillas ... (DELIMITER AS \ x7f) Aparece el mensaje de advertencia, pero los datos se cargan bien. Por lo que su declaración puede ser correcta, pero no en este caso. –

+0

Me refería a las cadenas en las sentencias de SQL, mientras que ahora está utilizando un comando psql. ¿Obtiene el mismo error usando el comando COPY en lugar de \ copy? – eppesuig

+0

Esta es la respuesta correcta. Las versiones modernas de PG ahora tienen por defecto tenerlo activado. – jpmc26

Cuestiones relacionadas