strings literais e caracteres de escape no PostgreSQL

votos
95

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?

Publicado 04/08/2008 em 02:00
fonte usuário
Em outras línguas...                            


5 respostas

votos
104

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

Eu encontrei uma discussão que indicou o texto precisava ser precedido com 'E', como tal:

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

Este suprimiu o aviso, mas o texto ainda não estava sendo retornado corretamente. Quando eu 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');
Respondeu 04/08/2008 em 02:07
fonte usuário

votos
32

Legal.

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

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

PostgreSQL também aceita "Escape" constantes string, que são uma extensão do padrão SQL. Uma seqüência de escape constante é especificado por escrito a letra E (maiúscula ou minúscula) pouco antes da abertura aspas simples, por exemplo E'foo'. (Quando continuando uma cadeia de escape constante em todas as linhas, escrever E somente antes da primeira citação de abertura.) Dentro de uma cadeia de caracteres de escape, uma barra invertida (\) começa uma sequência de escape de barra invertida C-semelhantes, nos quais a combinação de barra invertida e seguindo personagem ( s) representa um valor especial byte. \ B representa um retrocesso, \ f é um formulário de alimentação, \ n é uma nova linha, \ r é um retorno do carro, \ t é um separador. Também são suportados \ dígitos, onde dígitos representa um valor octal byte, e \ xhexdigits, onde hexdigits representa um valor hexadecimal byte. (É de sua responsabilidade que as seqüências de bytes que você cria são caracteres válidos na codificação de caracteres do servidor.) Qualquer outro caractere após uma barra invertida é tomado literalmente. Assim, para incluir uma barra invertida, escreva duas barras invertidas (\\). Além disso, uma única citação podem ser incluídos em uma cadeia de fuga por escrito \', além da forma normal de ''.

Respondeu 04/08/2008 em 02:14
fonte usuário

votos
5

O aviso é emitido desde que você está usando barras invertidas em suas cordas. Se você quiser evitar a mensagem, digite o comando "set standard_conforming_strings = on;". Em seguida, use "E" antes de sua seqüência incluindo barras invertidas que deseja PostgreSQL para intrepret.

Respondeu 17/02/2010 em 00:51
fonte usuário

votos
3

Acho altamente improvável para Postgres para truncar os dados na entrada - que tanto o rejeita ou armazena como é.

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 IGNORE  0 1
milen=> select * from EscapeTest;
          text
------------------------
 This will be inserted
  This will not be
(1 row)

milen=>
Respondeu 19/09/2008 em 20:24
fonte usuário

votos
2

Realmente pergunta estúpida: Você tem certeza a corda está sendo truncado, e não apenas quebrado na linebreak você especificar (e possivelmente não mostrando na sua interface)? Ou seja, você espera que o campo para mostrar como

Este será inserido \ n Este não será

ou

Isto irá ser inserido

Esta não será

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

Respondeu 16/09/2008 em 14:26
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more