異なる文字セットが原因のOracleインポートの問題


11

Oracle 11のエクスポートをOracle 11 XEにインポートしようとしています。

次のメッセージが表示されます。

XEでのインポートfehlerhaftインポートはWE8MSWIN1252文字セットで行われ、AL16UTF16 NCHAR文字セット
インポートサーバーはAL32UTF8文字セットを使用します(可能な文字セット変換)

アイデア、このダンプをOracle 11 XEにインポートする方法を教えてください。

編集:

テーブルを考える

CREATE TABLE BDATA.Artikel(
    Key                   VARCHAR2(3)  NOT NULL,
    Name                  VARCHAR2(60) NOT NULL,
    Abkuerzung            VARCHAR2(5)  NOT NULL
);

このようなエラーが発生します

IMP-00019: row rejected due to ORACLE error 12899
IMP-00003: ORACLE error 12899 encountered
ORA-12899: value too large for column "BDATA"."ARTIKEL"."ABKUERZUNG" (actual: 6, maximum: 5)
Column 1 ABL
Column 2 Aufbewahrungslösung
Column 3 AfbLö

一部の行がインポートから欠落しています。

回答:


8

それがテーブルの作成に使用している実際のDDLである場合は、NLS_LENGTH_SEMANTICSパラメーターを使用できます。これをデフォルトのBYTEではなくCHARに設定すると、VARCHAR2(5)には、5バイトではなく5文字(1文字しか許可されない可能性がある)のデータベース文字セット(潜在的には最大20バイト)に5文字を格納するのに十分なスペースが割り当てられます)。

残念ながら、NLS_LENGTH_SEMANTICSインポートプロセスに依存してテーブルを作成している場合は、おそらく変更してもそれほど役に立ちません。ダンプファイルは本質的にCHARまたはBYTEキーワードを追加するため、実際にステートメントを発行します。

CREATE TABLE BDATA.Artikel(
    Key                   VARCHAR2(3 BYTE)  NOT NULL,
    Name                  VARCHAR2(60 BYTE) NOT NULL,
    Abkuerzung            VARCHAR2(5 BYTE)  NOT NULL
);

テーブル作成スクリプトがあり、提案に従って変更できます。テーブルが既に作成されているときにimpが機能する場合は、すべて問題ありません。
bernd_k

@bernd_k-かっこいい。次に、DDLを実行する前にNLS_LENGTH_SEMANTICSを設定するか、DDLを変更してCHARをすべてのVARCHAR2列の宣言に追加します。インポートを行うときは、テーブルがすでに存在するため、CREATE TABLEステートメントの失敗を無視するように指示する必要があります。
ジャスティンケイブ

テーブル定義... VARCHAR2(60 CHAR)NOT NULL ...を変更し、IGNORE = YでIMPを使用しましたが、インポートは警告付きで正常に終了しました。
bernd_k '16年

4

あなたは、XEの文字セットの選択肢を持っていないあなたは、インポートしようとしているデータベースに合わせてそれを変更することはできませんので。エクスポート前にソースデータベースを移行することは現実的でしょうか?

インポートは機能しますが、文字セットの変換により、ASCII以外の文字を含む一部のテキスト列がインポート後に同じに見えなくなる場合があります。また、新しい文字セットで長すぎる行は拒否される可能性があります。

あなたのケースでは、UTF8に変換しています。つまり、変換中に1バイト文字が2(理論的にはそれ以上)に成長する可能性があります。ターゲットスキーマをエクスポートまたは調整し、別の手順でデータをインポートする前に、列サイズを増やす必要がある場合があります。その他の考えられるデータの切り捨ての問題については、こちらをご覧ください


私の編集を参照してください。私の唯一の望みは、最初に拡張幅でテーブルを作成し、インポートからの作成テーブルを無視してデータをインポートすることです。
bernd_k

impdpを使用していますか?方法についてはここを参照してください
ジャックはtopanswers.xyzを試してみます

まだではありませんが、おそらく学ぶのに良い時期です。
bernd_k

しかしimpdpのが唯一のexpdpで作成した輸出で使用できることに注意を
ジャック氏は述べていtopanswers.xyz試して

2

最も簡単な方法:(シャットダウンの必要性)

まず、sysdbaとして接続します。

sqplus / as sysdba

次に、次のスクリプトを実行します。

alter system set nls_length_semantics=CHAR scope=both;
shutdown;
startup restrict;
alter database character set INTERNAL_USE WE8ISO8859P1;
shutdown;
startup;

Oracle 12c Standard Two Editionでうまくいきました

引用元:http : //www.blogdelpibe.com/2015/05/como-solucionar-el-error-ora-12899.html


0

これは私のために働いた。これの代わりに:

imp u/p@db file=data.dmp

このようなものをbashで試してください:

imp u/p@db file=<(perl -pe'/^CREATE TABLE/&&s/(VARCHAR2\(\d+)\)/$1 CHAR)/g' data.dmp)

これはcol1 VARCHAR2(n)col1 VARCHAR2(n CHAR)で始まるすべての行に変更されCREATE TABLEます。たとえば、シェルで実行data.dmpできない場合は、impを実行する前に変更することもでき<(...)ます。

perl -i.bk -pe'/^CREATE TABLE/&&s/(VARCHAR2\(\d+)\)/$1 CHAR)/g' data.dmp

...しかし、それはbashでは不要であり、変換またはバックアップの作成で問題が発生する可能性があり-i.bkます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.