あるデータベースから別のデータベースにdmpファイルをインポートしようとしています。問題は、インポート中に一部の文字マップ変換が行われるため、一部の特殊なデンマーク文字が正しくインポートされないことです。
これは、impでインポートを開始したときの情報です(可能な文字変換に関する注意を参照してください)。
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Export file created by EXPORT:V10.02.01 via conventional path
import done in WE8ISO8859P1 character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
. importing USERNAME's objects into USERNAME
. . importing table "TABLE2"
IMP-00019: row rejected due to Oracle error 12899
IMP-00003: Oracle error 12899 encountered
ORA-12899: værdi er for stor for kolonnen "USERNAME"."TABLE2"."NAME" (faktisk: 32, maksimum: 30)
Column 1 408261
Column 2 KUBEN FÆLLES MÅLER
各特殊文字(通常はÆ、Ø、Å)は1ではなく2文字を使用しており、データはスペースで埋められて埋められるため、データにこのフィールドの31文字が含まれ、フィールドが定義されているというエラーが発生しますサイズ30として。
Dmpファイルを生成したエクスポートは、次のように実行されました。
SET CHARACTERSET=WE8PC850
SET NLS_LANG=DANISH
SET NLS_NUMERIC_CHARACTERS=.,
exp username/password@server1 dumpfile.dmp
インポートは次のように実行されました:これを正しく動作させるにはどうすればよいですか?
SET CHARACTERSET=WE8PC850
SET NLS_LANG=DANISH
SET NLS_NUMERIC_CHARACTERS=.,
imp username/password@server2 fromuser=username touser=username commit=y ignore=y file=dumpfile.dmp log=dumpfile.log
これを正しくするために何ができますか?インポートサーバーがAL32UTF8を使用しているため、imp
は使用されている文字セットを無視しているようです(これは誤りです)。
AL32UTF8文字セットを使用してデータベースにデータをインポートします(これがデフォルトです)。したがって、インポーターは文字をそれに合わせて変換する必要があり、一部はマルチバイト文字になります。これに対処するには2つの方法があります。
1)新しいデータベースでUnicodeが必要ない場合は、古いデータベースと同じ文字セットで再作成してください。古いデータベースでこのコードを実行して、文字セットを取得し、それを使用します
SELECT parameter, value
FROM nls_database_parameters
WHERE parameter
LIKE '%CHARACTERSET';
新しいデータベースと古いデータベースの文字セットが同じになると、インポートで変換を行う必要がなくなります。
2)テーブルを事前に作成できる場合は、 NLS_LENGTH_SEMANTICS パラメータを使用できます。これをBYTEのデフォルトではなくCHARに設定すると、VARCHAR2(5)には、5バイトではなくデータベースキャラクタセット(潜在的には最大20バイト)に5文字を格納するのに十分なスペースが割り当てられます)。あるいは、テーブル作成DDLを変更して、すべてのVARCHAR2列宣言にCHARを追加することもできます。例えば.
CREATE TABLE xyz (column_x VARCHAR2(10 CHAR) NOT NULL);
このようにして、データをUnicodeに変換し、今後より良い文字セットを使用することができます。アプリケーションがそれをサポートできる限り、これはおそらく推奨される方法です。
すべての文字フィールドを変更して、デフォルトのCHAR
の代わりにBYTE
を使用することで、これを解決しました。これは基本的に 彼の答え の@ BrokenCrustによって提案されたオプション2です。テーブルを再作成する代わりに、次のSQLを使用してテーブルを再定義しました。
set head off;
set linesize 1000;
set colsep ";";
set trimspool on;
set pagesize 0;
set verify off;
set feedback off;
set term off;
column dcol new_value mydate noprint;
select to_char(sysdate,'YYYY-MM-DD_HH24MISS') dcol from dual;
select to_char(sysdate,'YYYY-MM-DD') dcol from dual;
spool c:\temp\From_Byte_to_Char_og_VarChar2&mydate;
select '-- '||sysdate from dual;
select 'ALTER TABLE '||TABLE_NAME||
' MODIFY '||COLUMN_NAME||' CHAR('||data_length||' CHAR);'
from
user_tab_cols
where
DATA_TYPE='CHAR'
;
select 'ALTER TABLE '||TABLE_NAME||
' MODIFY '||COLUMN_NAME||' VARCHAR2('||data_length||' CHAR);'
from
user_tab_cols
where
DATA_TYPE='VARCHAR2'
;
select 'commit ;' from dual;
select 'exit ;' from dual;
spool off ;
oracleサーバーXEを使用している場合、データベースサーバーまたはデータベースの文字セットを変更することはできません。私も答えを探しています。