A importação de metadados do Datapump apenas altera o comprimento de dados ao importar com conversão: (exportação feita em WE8ISO8859P15 e importação feita em conjunto de caracteres AL32UTF8 e conjunto de caracteres AL16UTF16 NCHAR)
Tabela de exemplo: 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
Target-SYSTEM (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
O comprimento dos dados de varchar2(char 2000) foi alterado para varchar2(char 4000) automaticamente. Qual é a regra definida para esse comportamento? Este é um comportamento documentado?
Edit: O problema parece não estar relacionado ao datapump, mas à conversão de um caractere único para um conjunto de vários caracteres:
Source-SYSTEM (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
Target-SYSTEM (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
Nota: No banco de dados antigo (conjunto de caracteres = WE8ISO8859P15) DATA_LENGTH=1*CHAR_LENGTH para todas as colunas com VARCHAR2 DATA_TYPE (independente de CHAR_USED).
No novo banco de dados (com o conjunto de caracteres UNICODE AL32UTF8) DATA_LENGTH=4*CHAR_LENGTH (ou max-value = 4000) para todas as colunas com VARCHAR2 DATA_TYPE e CHAR_USED=C.
Se criarmos
VARCHAR2(5)
ouVARCHAR2(5 BYTE)
, colocaremos uma restrição no máximo de 5 bytes.Se criarmos
VARCHAR2(5 CHAR)
, colocaremos uma restrição no máximo de 5 caracteres.Em
WE8ISO8859P15
cada caractere consiste em 1 byte, entãoVARCHAR2(5)
é equivalente aVARCHAR2(5 CHAR)
eDATA_LENGTH
=CHAR_LENGTH
.Em
AL16UTF16
cada caractere consiste em 2 bytes e em todos os casosDATA_LENGTH
=2 * CHAR_LENGTH
.Em
AL32UTF8
caráter pode consistir de 1-4 bytes. SoVARCHAR2(5)
eVARCHAR2(5 BYTE)
colocará restrição no máximo de 5 bytes (cinco caracteres de 1 byte caberão, dois caracteres de 4 bytes não caberão). EVARCHAR2(5 CHAR)
colocará restrição no máximo de 5 caracteres, portanto, no pior cenário, cinco caracteres de 4 bytes caberão eDATA_LENGTH
serão4 * CHAR_LENGTH
.