web-dev-qa-db-ja.com

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

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ö

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

11
bernd_k

それがテーブルの作成に使用している実際のDDLである場合は、 NLS_LENGTH_SEMANTICS パラメーターを使用できます。これをBYTEのデフォルトではなくCHARに設定すると、VARCHAR2(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
);
8
Justin Cave

XEでは文字セットを選択できない なので、インポートしようとしているデータベースに合わせて変更することはできません。エクスポートする前に migrate ソースデータベースを使用するのが現実的でしょうか?

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

あなたのケースでは、UTF8に変換しています。これは、1バイト文字が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

2
Walter Colchado

これでうまくいきました。これの代わりに:

_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)
_

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

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

...しかし、bashでは必要ありません。_-i.bk_で述べられているように、変換やバックアップの作成で問題が発生する可能性があります。

0
Kjetil S.