数据泵元数据仅在通过转换导入时更改数据长度:(以 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)。