Pergunta

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 PSQL 8.2)

Alguém sabe como contornar isso?

Foi útil?

Solução

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

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 conforme sugerido por Michael, funcionou.

Como tal:

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

Outras dicas

Legal.

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 string de escape é especificada escrevendo a letra E (maiúscula ou minúscula) logo antes da aspa simples de abertura, por exemplo.E'foo'.(Ao continuar uma constante de string de escape entre linhas, escreva E somente antes da primeira aspa de abertura.) Dentro de uma string de escape, um caractere de barra invertida (\) inicia uma sequência de escape de barra invertida semelhante a C, na qual a combinação de barra invertida e o caractere seguinte( s) representa um valor de byte especial.\b é um backspace, \f é um feed de formulário, é uma nova linha, é um retorno de carro, é uma tabulação.Também são suportados \digits, onde dígitos representa um valor de byte octal, e \xhexdigits, onde hexdigits representa um valor de byte hexadecimal.(É sua responsabilidade que as sequências de bytes criadas sejam caracteres válidos na codificação do conjunto de caracteres do servidor.) Qualquer outro caractere após uma barra invertida será interpretado literalmente.Assim, para incluir 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 da forma normal de ''.

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

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

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 aparecendo em sua interface)?Ou seja, você espera que o campo apareça como

Isso será inserido n, isso não será

ou

Isto será inserido

Isto não será

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top