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

Lists: pgsql-es-ayuda
From: Alejandro Gasca <agasca(at)yahoo(dot)com>
To: ayuda postgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Ayuda con "escape string syntax E'...' "
Date: 2007-03-31 13:25:16
Message-ID: 955669.63581.qm@web34315.mail.mud.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

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?

¿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'...' ?

ejemplo:
hago: pg_dump -a -t tabla_fn base prueba > churrin
--
-- PostgreSQL database dump
--

SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;

SET search_path = public, pg_catalog;

--
-- Data for Name: tabla_fn; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY tabla_fn (entero, texto) FROM stdin;
1 SALTO DE\nLÍNEA
\.

--
-- PostgreSQL database dump complete

¿o como se supone que se pondría "SALTO DE\nLÍNEA" en este contexto?

Pregunto todo esto porque estoy haciendo una aplicacion (en c#) (por si a alguien le interesa testearla) que sige este formato para dumpear bases de access, pero al llegar a los \n y los \r la cosa no funciona.

Todo funciona bien si se usa npgsql, pero para bases grandes sería preferible (i.e. mas rápido) usar, pienso, el formato de texto plano del pg_dump

Gracias.

Alejandro.

__________________________________________________
Correo Yahoo!
Espacio para todos tus mensajes, antivirus y antispam ¡gratis!
Regístrate ya - http://correo.espanol.yahoo.com/


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