web-dev-qa-db-ja.com

impに正しい文字セットを使用させるにはどうすればよいですか?

あるデータベースから別のデータベースに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は使用されている文字セットを無視しているようです(これは誤りです)。

3
awe

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に変換し、今後より良い文字セットを使用することができます。アプリケーションがそれをサポートできる限り、これはおそらく推奨される方法です。

3
user76587

すべての文字フィールドを変更して、デフォルトの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 ;
1
awe

oracleサーバーXEを使用している場合、データベースサーバーまたはデータベースの文字セットを変更することはできません。私も答えを探しています。

0
Mert Gülsoy