Oracle

Datapump metadata-only import 在使用轉換導入時更改數據長度

  • August 27, 2021

數據泵元數據僅在通過轉換導入時更改數據長度:(在 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)or VARCHAR2(5 BYTE),我們會限制最多 5 個字節。

如果我們創建VARCHAR2(5 CHAR),我們會限制最多 5 個字元。

WE8ISO8859P15每個字元中包含 1 個字節,因此VARCHAR2(5)相當於VARCHAR2(5 CHAR)and DATA_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.

引用自:https://dba.stackexchange.com/questions/298637