2

バックスラッシュの文字列の直後にフォワードスラッシュが続くファイルをpostgresからディスクに書き込む必要があります\/

これに似たコードは機能しませんでした:

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()を運がなくても2倍にしてみました。

私はここで解決策を見つけたことに注意しましたPostgresマニュアル

Postgres 9.2を実行し、UTF-8をエンコードしました。

4

2 に答える 2

2

問題は、COPYプレーンテキストファイルを書き出すことを意図していないことです。によって読み戻すことができるファイルを書き出すことを目的としていますCOPY。また、使用する半内部エンコーディングは、バックスラッシュをエスケープします。

あなたがしたいことのために、あなたはいくつかのカスタムコードを書く必要があります。通常のクライアントライブラリを使用してクエリ結果を読み取り、ファイルに書き込むか、サーバー内で実行する場合は、PL/PerlやPL/Pythonなどを使用します。

于 2013-01-02T15:39:48.310 に答える
0

\ excapingは、stringliteralの前に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は、機能と見なす必要があります

       -- 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'
        ;
于 2013-01-02T16:14:06.197 に答える