2013-01-02 75 views
2

我需要寫從Postgres的文件到硬盤有後面緊跟一個斜槓反斜槓的字符串\/轉義反斜線在PostgreSQL

代碼類似這樣沒有工作:

drop table if exists test; 
create temporary table test (linetext text); 
insert into test values ('\/\/foo foo foo\/bar\/bar'); 
copy (select linetext from test) to '/filepath/postproductionscript.sh'; 

上面的代碼產生\\/\\/foo foo foo\\/bar\\/bar ...它插入一個額外的反斜槓。

當您查看臨時表中,該字符串被正確地視爲\/\/,所以,E的變化之前,我不知道在哪裏,當文字變成\\/\\/

我已經試過加倍\字符串和quote_literal()沒有運氣。

我注意到在這裏找到Postgres Manual

的解決方案運行的Postgres 9.2,UTF-8編碼。

+0

聽起來就像是'copy'命令不作爲數據被正確地存儲在數據庫中的逃逸。雖然我不知道COPY命令的行爲如何。 –

+0

[_可以在COPY數據中使用摺疊字符(\\)來引用可能作爲行或列分隔符使用的數據字符。特別是,如果以下字符作爲列值的一部分顯示,則必須在前面加上反斜槓:反斜槓本身,換行符,回車符,以及當前的分隔字符._](http://www.postgresql.org/docs /current/static/sql-copy.html) –

回答

2

問題是COPY不是用來寫出純文本文件。它旨在寫出可由COPY讀回的文件。而它使用的半內部編碼做了一些反斜槓轉義。

對於您想要做的事情,您需要編寫一些自定義代碼。要麼使用普通的客戶端庫來讀取查詢結果並將它們寫入文件,要麼使用PL/Perl或PL/Python之類的東西。

+0

你可能是對的,這是我不想聽到的答案。除非有其他想法,否則我可能需要長時間解決這個問題......我將代碼中的反斜槓部分放入一個單獨的shell腳本中,並且我將讓postgres生成一個調用並將一個變量傳遞給該腳本。這似乎是目前最乾淨的方法。 [我希望有一個用於編寫純文本文件的Postgres模塊]謝謝。 – Paulb

0

的\ excaping如果串文字是爲E前綴時,才能識別,否則standard_conforming_strings設置(或類似)尊重(ANSI-SQL有串逃逸,可能是由COBOL所產生;-)以不同的方式。

drop table if exists test; 
create temporary table test (linetext text); 
insert into test values (E'\/\/foo foo foo\/bar\/bar'); 
copy (select linetext from test) to '/tmp/postproductionscript.sh'; 

UPATE:一個醜陋的黑客是使用.csv格式,仍然使用\ t作爲分隔符。 的#!/ bin/sh的爲認領headerline應consdered功能

 -- without a header line 
drop table if exists test; 
create temporary table test (linetext text); 
insert into test values ('\/\/foo foo foo\/bar\/bar'); 
copy (select linetext AS "#linetext" from test) to '/tmp/postproductionscript_c.sh' 
     WITH CSV 
     DELIMITER E'\t' 
     ; 
     -- with a shebang header line 
drop table if exists test; 
create temporary table test (linetext text); 
insert into test values ('\/\/foo foo foo\/bar\/bar'); 
copy (select linetext AS "#/bin/sh" from test) to '/tmp/postproductionscript_h.sh' 
     WITH CSV 
     HEADER 
     DELIMITER E'\t' 
     ; 
+0

謝謝。至少在我的配置中,我試過這個代碼,沒有運氣。它產生// foo foo foo/bar/bar。 – Paulb

+0

但是你希望* *反斜槓和斜槓在字符串中?什麼是原始字符串?(我認爲values()是用於演示的目的) – wildplasser

+0

謝謝。我會看看。我一直試圖用你的代碼建議..結果從來沒有奏效,有時他們是意想不到的。我認爲彼得是正確的。複製是爲了自己的目的在做內部事情。我將探索CSV的想法。 – Paulb