it-swarm.it

Problema di importazione Oracle causato da diversi set di caratteri

Sto cercando di importare un'esportazione Oracle 11 in Oracle 11 XE.

Ricevo i seguenti messaggi:

importazione in XE fehlerhaft importazione eseguita nel set di caratteri WE8MSWIN1252 e nel set di caratteri NCHAR AL16UTF16
server di importazione utilizza il set di caratteri AL32UTF8 (possibile conversione set di caratteri)

Qualche idea, come posso importare questo dump in Oracle 11 XE?

Edit:

Dato un tavolo

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

Ottengo errori come questo

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ö

Nell'importazione mancano alcune righe.

11
bernd_k

Se questo è il DDL effettivo che stai utilizzando per creare la tabella, puoi utilizzare il parametro NLS_LENGTH_SEMANTICS . Se lo si imposta su CHAR anziché sul valore predefinito di BYTE, a VARCHAR2 (5) verrà assegnato spazio sufficiente per memorizzare 5 caratteri nel set di caratteri del database (potenzialmente fino a 20 byte) anziché 5 byte (che potrebbe consentire solo 1 carattere ).

Sfortunatamente, cambiando il NLS_LENGTH_SEMANTICS probabilmente non sarà di grande aiuto se stai facendo affidamento sul processo di importazione per creare la tabella: il file di dump aggiungerà intrinsecamente la parola chiave CHAR o BYTE in modo da emettere effettivamente l'istruzione

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

non hai una scelta di set di caratteri su XE quindi non puoi cambiarlo per adattarlo al database che stai cercando di importare. Sarebbe pratico migrare il database di origine prima dell'esportazione?

L'importazione dovrebbe funzionare, ma la conversione del set di caratteri potrebbe significare che alcune colonne di testo con caratteri non ASCII non avranno lo stesso aspetto dopo l'importazione. E le righe possono essere rifiutate se sono troppo lunghe nel nuovo set di caratteri.

Nel tuo caso, stai convertendo in UTF8, il che significa che è possibile che un carattere a byte singolo cresca durante la conversione in 2 ( o più in teoria ). Potrebbe essere necessario aumentare le dimensioni della colonna prima di esportare o regolare lo schema di destinazione e importare i dati in un passaggio separato. Vedere qui per altri possibili problemi di troncamento dei dati

Il modo più semplice: (Shutdown neccesary) :

Innanzitutto, Connetti come sysdba:

sqplus / as sysdba

Quindi, esegui il seguente script:

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

Ha funzionato per me in una Oracle 12c Standard Two Edition

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

2
Walter Colchado

Questo ha funzionato per me. Invece di questo:

imp u/[email protected] file=data.dmp

Prova qualcosa del genere in bash:

imp u/[email protected] file=<(Perl -pe'/^CREATE TABLE/&&s/(VARCHAR2\(\d+)\)/$1 CHAR)/g' data.dmp)

Questo cambia ogni col1 VARCHAR2(n) in col1 VARCHAR2(n CHAR) in righe che iniziano con CREATE TABLE. Puoi anche cambiare data.dmp Prima di eseguire imp su di esso, se non sei in grado di <(...) nella tua Shell, ad esempio:

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

... ma non è necessario in bash e qualcosa potrebbe andare storto nella conversione o nel fare il backup come indicato da -i.bk.

0
Kjetil S.