Literais de string e caracteres de escape no postgresql

A tentativa de inserir um caractere de escape em uma tabela resulta em um aviso.

Por exemplo:

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

Produz o aviso:

 WARNING: nonstandard use of escape in a string literal 

( Usando o PSQL 8.2 )

Alguém sabe como contornar isso?

Parcialmente O texto é inserido, mas o aviso ainda é gerado.

Eu encontrei uma discussão que indicava que o texto precisava ser precedido de ‘E’, como tal:

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

Isso suprimiu o aviso, mas o texto ainda não estava sendo retornado corretamente. Quando adicionei a barra adicional, como Michael sugeriu, funcionou.

Assim sendo:

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

Legal.

Eu também achei a documentação referente ao E:

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

O PostgreSQL também aceita constantes de string “escape”, que são uma extensão do padrão SQL. Uma constante de string de escape é especificada escrevendo a letra E (maiúscula ou minúscula) logo antes da aspas simples de abertura, por exemplo, E’foo ‘. (Ao continuar uma seqüência de escape entre linhas, escreva E somente antes da primeira citação de abertura.) Dentro de uma seqüência de escape, um caractere de barra invertida (\) inicia uma seqüência de escape de barra invertida semelhante ao C, na qual a combinação de barra invertida e seguinte caractere ( s) representa um valor especial de byte. \ b é um backspace, \ f é um feed de formulário, \ n é uma nova linha, \ r é um retorno de carro, \ t é uma tabulação. Também são suportados \ digits, onde dígitos representam um valor de byte octal e \ xhexdigits, onde hexadígitos representam um valor de byte hexadecimal. (É de sua responsabilidade que as seqüências de bytes que você cria sejam caracteres válidos na codificação do conjunto de caracteres do servidor.) Qualquer outro caractere após uma barra invertida é considerado literalmente. Assim, para include um caractere de barra invertida, escreva duas barras invertidas (\\). Além disso, uma aspa simples pode ser incluída em uma string de escape escrevendo \ ‘, além do modo normal de’ ‘.

O aviso é emitido porque você está usando barras invertidas em suas strings. Se você quiser evitar a mensagem, digite este comando “set standard_conforming_strings = on;”. Em seguida, use “E” antes da string, incluindo as barras invertidas que você deseja que o postgresql intreprete.

Eu acho altamente improvável que o Postgres trunque seus dados na input – ele o rejeita ou armazena 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, eg, E'\r\n'. INSERT 0 1 milen=> select * from EscapeTest; text ------------------------ This will be inserted This will not be (1 row) milen=> 

Pergunta realmente idiota: você tem certeza de que a string está sendo truncada, e não apenas quebrada no linebreak que você especificou (e possivelmente não mostrada na sua interface)? Ou seja, você espera que o campo seja mostrado como

Isto será inserido \ n Isto não será

ou

Isto será inserido

Isso não será

Além disso, qual interface você está usando? É possível que algo ao longo do caminho esteja comendo suas barras invertidas?