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