Re: Ayuda con "escape string syntax E'...' "

From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Alejandro Gasca <agasca(at)yahoo(dot)com>
Cc: ayuda postgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Ayuda con "escape string syntax E'...' "
Date: 2007-03-31 18:03:37
Message-ID: 20070331180337.GE5761@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Alejandro Gasca escribió:
> Saludos.
>
> cuando hago:
>
> select 'cadena con\nsalto de linea';
>
> el server me manda el siguiete warning en el log:
> WARNING: uso no estandar de escape en un literal de cadena en carácter 8
> HINT: Use la sintaxis de escape para cadenas, por ej. E'\r\n'.
>
> despues de estarle moviendo un rato, me di cuenta que haciendo esto, la cosa funciona bien:
> select 'cadena con'||E'\n'||'salto de linea';
>
> mi pregunta... esta es la unica manera de usar "E'...'" o hay una
> manera mas directas de meter esta notacion a la cadena?

Me sorprende que te hayas complicado tanto :-) Es mucho mas sencillo:

select e'cadena con\nsalto de linea';

La otra forma (la que es conforme al estandar) es asi:

select 'cadena con
salto de linea';

El e'' es una extension de Postgres, para permitir compatibilidad hacia
atras con las versiones que aceptaban los backslash en los literales de
cadena.

> ¿Por que cuando pongo standard_conforming_strings = on en
> postgres.conf, y aún cunado la linea sale del pg_dump, la cadena que
> se genera en el insert no usa la notacion E'...' ?

Es que pg_dump no genera un literal de cadena; lo que genera es entrada
para COPY, que no es lo mismo.

Los literales de cadena estan gobernados por el estandar SQL, el cual
dice que los literales de cadena no tienen escapado de caracteres con \.
De hecho muchos otros RDBMS funcionan asi, y es por compatibilidad con
aplicaciones hechas para esos otros RDBMS (y por supuesto para cumplir
con lo que el estandar manda) que se invento lo de
standard_conforming_strings. Has de saber que era forzoso cambiar del
comportamiento antiguo (que si soportaba caracteres escapados con \) al
comportamiento nuevo (que no), pero no podia llegar y cambiarse, sino
que tenia que hacerse gradualmente; he ahi la razon del
standard_conforming_strings.

La entrada de COPY no tiene esas mismas limitantes, y por eso se hace de
la otra manera. Prueba con "pg_dump -d", que te va a mostrar un INSERT
en lugar de COPY; veras que no usa el \n.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Mario Wojcik 2007-03-31 20:02:20 Re: Sentencia SQL para dos registros por grupo
Previous Message Alvaro Herrera 2007-03-31 17:06:18 Re: problema con pg_dump en campos text con saltos de linea