Datapump metadata-only import 在使用轉換導入時更改數據長度
數據泵元數據僅在通過轉換導入時更改數據長度:(在 WE8ISO8859P15 中完成導出並在 AL32UTF8 字元集和 AL16UTF16 NCHAR 字元集中完成導入)
範例表:Source-SYSTEM (WE8ISO8859P15):
select OWNER,TABLE_NAME,COLUMN_NAME,DATA_LENGTH from dba_tab_columns where TABLE_NAME='STRING'; OWNER TABLE_NAME COLUMN_NAME DATA_LENGTH --------------- -------------------- -------------------- ----------- SCHEMA_NAME STRING DE 2000
目標系統(AL16UTF16):
select OWNER,TABLE_NAME,COLUMN_NAME,DATA_LENGTH from dba_tab_columns where TABLE_NAME='STRING'; OWNER TABLE_NAME COLUMN_NAME DATA_LENGTH --------------- -------------------- -------------------- ----------- SCHEMA_NAME STRING DE 4000
varchar2(char 2000) 的數據長度已自動更改為 varchar2(char 4000)。這種行為的規則是什麼?這是記錄在案的行為嗎?
編輯:這個問題似乎與數據泵無關,而是與從單字元到多字元集的轉換有關:
源系統(WE8ISO8859P15):
create table test(name varchar2(50), name2 varchar2(5 char), name3 clob); INSERT INTO test VALUES('Susanne','Test','Hi This is Row one'); select owner,TABLE_NAME, COLUMN_NAME, DATA_LENGTH, CHAR_LENGTH, data_type,char_used FROM ALL_TAB_COLUMNS where TABLE_NAME='TEST'; SCHEMA_NAME TEST NAME 50 50 VARCHAR2 B SCHEMA_NAME TEST NAME2 5 5 VARCHAR2 C SCHEMA_NAME TEST NAME3 4000 0 CLOB
目標系統(AL16UTF16):
create table test(name varchar2(50), name2 varchar2(5 char), name3 clob); INSERT INTO test VALUES('Susanne','Test','Hi This is Row one'); select owner,TABLE_NAME, COLUMN_NAME, DATA_LENGTH, CHAR_LENGTH, data_type,char_used FROM ALL_TAB_COLUMNS where TABLE_NAME='TEST'; SCHEMA_NAME TEST NAME 50 50 VARCHAR2 B SCHEMA_NAME TEST NAME2 20 5 VARCHAR2 C SCHEMA_NAME TEST NAME3 4000 0 CLOB
注意:在舊數據庫(字元集 = WE8ISO8859P15)中,對於所有具有 VARCHAR2 DATA_TYPE(獨立於 CHAR_USED)的列,DATA_LENGTH=1*CHAR_LENGTH。
在新數據庫(使用 UNICODE 字元集 AL32UTF8)中,對於所有具有 VARCHAR2 DATA_TYPE 和 CHAR_USED=C 的列,DATA_LENGTH=4*CHAR_LENGTH(或最大值 = 4000)。
如果我們創建
VARCHAR2(5)
orVARCHAR2(5 BYTE)
,我們會限制最多 5 個字節。如果我們創建
VARCHAR2(5 CHAR)
,我們會限制最多 5 個字元。在
WE8ISO8859P15
每個字元中包含 1 個字節,因此VARCHAR2(5)
相當於VARCHAR2(5 CHAR)
andDATA_LENGTH
=CHAR_LENGTH
。在
AL16UTF16
每個字元中包含 2 個字節,並且在所有情況下DATA_LENGTH
=2 * CHAR_LENGTH
。字元中
AL32UTF8
可能包含 1-4 個字節。因此VARCHAR2(5)
,並且VARCHAR2(5 BYTE)
將限制最多 5 個字節(五個 1 字節字元將適合,兩個 4 字節字元將不適合)。並且VARCHAR2(5 CHAR)
將限制最多 5 個字元,因此在最壞的情況下,五個 4 字節字元將適合併且DATA_LENGTH
將是4 * CHAR_LENGTH
.