Problema de importação do Oracle causado por diferentes conjuntos de caracteres

11

Estou tentando importar uma exportação do Oracle 11 para o Oracle 11 XE.

Eu recebo as seguintes mensagens:

importação no XE fehlerhaft A importação feita no conjunto de caracteres WE8MSWIN1252 e no
servidor de importação do conjunto de caracteres AL16UTF16 NCHAR usa o conjunto de caracteres AL32UTF8 (possível conversão de conjunto de caracteres)

Alguma idéia, como posso importar esse despejo para o Oracle 11 XE?

Editar:

Dada uma tabela

CREATE TABLE BDATA.Artikel(
    Key                   VARCHAR2(3)  NOT NULL,
    Name                  VARCHAR2(60) NOT NULL,
    Abkuerzung            VARCHAR2(5)  NOT NULL
);

Eu recebo erros como este

IMP-00019: row rejected due to ORACLE error 12899
IMP-00003: ORACLE error 12899 encountered
ORA-12899: value too large for column "BDATA"."ARTIKEL"."ABKUERZUNG" (actual: 6, maximum: 5)
Column 1 ABL
Column 2 Aufbewahrungslösung
Column 3 AfbLö

Algumas linhas estão ausentes na importação.

bernd_k
fonte

Respostas:

8

Se esse é o DDL real que você está usando para criar a tabela, você pode usar o parâmetro NLS_LENGTH_SEMANTICS . Se você definir CHAR em vez do padrão de BYTE, um VARCHAR2 (5) terá espaço suficiente para armazenar 5 caracteres no conjunto de caracteres do banco de dados (potencialmente até 20 bytes) em vez de 5 bytes (o que poderia permitir apenas 1 caractere )

Infelizmente, alterar o NLS_LENGTH_SEMANTICSprovavelmente não será muito útil se você estiver contando com o processo de importação para criar a tabela - o arquivo de despejo adicionará inerentemente a palavra-chave CHAR ou BYTE para que ele realmente emita a instrução

CREATE TABLE BDATA.Artikel(
    Key                   VARCHAR2(3 BYTE)  NOT NULL,
    Name                  VARCHAR2(60 BYTE) NOT NULL,
    Abkuerzung            VARCHAR2(5 BYTE)  NOT NULL
);
Justin Cave
fonte
Eu tenho o script create table e posso modificá-lo de acordo com sua proposta. Se imp funcionar quando as tabelas já estiverem criadas, tudo ficará bem.
Bernd_k 16/05
@bernd_k - Legal. Em seguida, você pode definir NLS_LENGTH_SEMANTICS antes de executar o DDL ou modificar o DDL para adicionar CHAR a cada declaração de coluna VARCHAR2. Quando você faz a importação, basta dizer para ignorar a falha das instruções CREATE TABLE, pois as tabelas já existem.
Justin Cave
Alterei minha definição de tabela ... VARCHAR2 (60 CHAR) NOT NULL ... e usei o IMP com IGNORE = Y e Import encerrado com êxito com avisos.
Bernd_k 16/05
4

Você não tem uma opção de conjunto de caracteres no XE, portanto, não pode alterá-lo para se adequar ao banco de dados que está tentando importar. Seria prático migrar o banco de dados de origem antes da exportação?

A importação deve funcionar, mas a conversão do conjunto de caracteres pode significar que algumas colunas de texto com caracteres não-ascii não terão a mesma aparência após a importação. E as linhas podem ser rejeitadas se forem muito longas no novo conjunto de caracteres.

No seu caso, você está convertendo para UTF8, o que significa que é possível que um caractere de byte cresça durante a conversão para 2 ( ou mais, em teoria ). Pode ser necessário aumentar o tamanho da coluna antes de exportar ou ajustar o esquema de destino e importar os dados em uma etapa separada. Consulte aqui para outros possíveis problemas de truncamento de dados

Jack diz que tenta topanswers.xyz
fonte
Veja minha edição. Minha única esperança é primeiro criar as tabelas com largura estendida e importar os dados, ignorando as tabelas de criação da importação.
Bernd_k 16/05
você está usando impdp? veja aqui como
Jack diz que tente topanswers.xyz 16/05
ainda não, mas talvez um bom momento para aprender.
Bernd_k 16/05
Mas note que impdp só pode ser usado com exportações criados com expdp
Jack diz tentativa topanswers.xyz
2

A maneira mais fácil: (Shutdown neccesary) :

Primeiro, conecte como sysdba:

sqplus / as sysdba

Em seguida, execute o seguinte script:

alter system set nls_length_semantics=CHAR scope=both;
shutdown;
startup restrict;
alter database character set INTERNAL_USE WE8ISO8859P1;
shutdown;
startup;

Funcionou para mim em um Oracle 12c Standard Two Edition

Retirado de: http://www.blogdelpibe.com/2015/05/como-solucionar-el-error-ora-12899.html

Walter Colchado
fonte
0

Isso funcionou para mim. Em vez disso:

imp u/p@db file=data.dmp

Tente algo assim no bash:

imp u/p@db file=<(perl -pe'/^CREATE TABLE/&&s/(VARCHAR2\(\d+)\)/$1 CHAR)/g' data.dmp)

Isso muda a cada col1 VARCHAR2(n)para col1 VARCHAR2(n CHAR)em linhas começando com CREATE TABLE. Você também pode mudar data.dmpantes de executá-lo, se não conseguir, <(...)por exemplo:

perl -i.bk -pe'/^CREATE TABLE/&&s/(VARCHAR2\(\d+)\)/$1 CHAR)/g' data.dmp

... mas não é necessário no bash e algo pode dar errado na conversão ou no backup, conforme declarado -i.bk.

Kjetil S.
fonte