standard_conforming_strings
がoff
に設定されているPostgres 8.1インスタンスを持っています(==はスラッシュをエスケープ文字として扱います)。最近のPostgresバージョンには、デフォルトでこの設定on
があります(正当な理由による)。
ダンプを8.1から9.xにインポートする場合、9.x DBでこの設定をoff
に設定できますが、したくないので、ダンプを適切な形式に変換したいと思います。これは100 GB以下のダンプです。
どうすればできますか? 8.1バージョンでこの設定を単に「オン」にすることはできますか? (それは既存のデータのエクスポートに影響しますか?それは既存のデータを破壊または変更しますか?
機能しないもの:9.x DBでstandard_conforming_stringsをoff
に設定せずに、8.1によって生成されたデータを9.xにインポートするだけです。結果は破損したデータです。
8.1インスタンスでテストすると、問題があるように見えません。次の3つの異なる例を参照してください。
データを作成
SHOW standard_conforming_strings ;
standard_conforming_strings
-----------------------------
off
CREATE TABLE bla(t text);
INSERT INTO bla VALUES('abc''def');
INSERT INTO bla VALUES(E'abc\\def');
1。8.1 pg_dumpでの8.1データのダンプ
$ pg81/bin/pg_dump db
これは(無関係なものを削除した後)生成します:
コピーbla(t)FROM stdin; abc'def abc \\ def \。
ここに standard_conforming_strings
はCOPY形式が独立しているため重要ではありません。このCOPYを実行しても、オンでもオフでも違いはありません。
2。--insertsオプションを使用した8.1 pg_dumpでの8.1データのダンプ
$ pg81/bin/pg_dump --inserts db
したがって、COPYは使用されません。ダンプには、興味深い部分が含まれています。
INSERT INTO bla VALUES ('abc''def');
INSERT INTO bla VALUES (E'abc\\def');
E'...'
構文が使用され、standard_conforming_strings
は関係ありません。これらの文字列は、設定がオンであるかオフであるかにかかわらず、postgres> = 8.1のどのバージョンでも正しく解釈されます
3.8.1データのダンプと9.1 pg_dumpの--insertsオプション
$ pg91/bin/pg_dump --inserts db
今、ダンプはこれを偶然に始めています
SET standard_conforming_strings = off;
そしてデータセクションで:
INSERT INTO bla VALUES ('abc''def');
INSERT INTO bla VALUES ('abc\\def');
したがって、8.1のpg_dumpとは異なりますが、自動的に処理されますが、このダンプは何も調整せずに、どのバージョンのpostgres> = 8.1でも直接再ロードできます。