Literais de string e caracteres de escape no postgresql




escaping (4)

Tentar 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?


Acho altamente improvável que o Postgres trunque seus dados na entrada - ele os rejeita ou os armazena como estão.

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=>

Legal.

Eu também encontrei 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 cadeia de escape é especificada escrevendo a letra E (maiúscula ou minúscula) imediatamente antes da aspas simples de abertura, por exemplo, E'foo '. (Ao continuar uma constante de cadeia de escape entre linhas, escreva E somente antes da primeira citação de abertura.) Dentro de uma cadeia de escape, um caractere de barra invertida (\) inicia uma sequência de escape de barra invertida do tipo C, na qual a combinação de barra invertida e o caractere a seguir ( s) representa um valor de byte especial. \ b é um backspace, \ f é um feed de formulário, \ n é uma nova linha, \ r é um retorno de carro, \ t é uma guia. Também são suportados \ digits, em que dígitos representam um valor de bytes octais e \ xhexdigits, em que hexdigits representa um valor de bytes hexadecimais. (É de sua responsabilidade que as seqüências de bytes que você criar sejam caracteres válidos na codificação do conjunto de caracteres do servidor.) Qualquer outro caractere após uma barra invertida é interpretado literalmente. Portanto, para incluir um caractere de barra invertida, escreva duas barras invertidas (\\). Além disso, uma aspas simples pode ser incluída em uma string de escape, escrevendo \ ', além da maneira normal de' '.


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, ela funcionou.

Assim sendo:

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

Pergunta realmente estúpida: Você tem certeza de que a string está sendo truncada e não apenas quebrada na quebra de linha especificada (e possivelmente não sendo exibida na sua interface)? Ou seja, você espera que o campo seja exibido como

Isso será inserido \ n Isso não será

ou

Isso 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?







escaping