Problema di importazione Oracle causato da diversi set di caratteri


11

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 Il
server di importazione utilizza il set di caratteri AL32UTF8 (possibile conversione del set di caratteri)

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

Modificare:

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.

Risposte:


8

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, la modifica di NLS_LENGTH_SEMANTICSprobabilmente non sarà molto utile se si fa 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
);

Ho lo script di creazione tabella e posso modificarlo in base alla tua proposta. Se imp funziona quando le tabelle sono già state create, tutto andrebbe bene.
bernd_k,

@bernd_k - Fantastico. Quindi è possibile impostare NLS_LENGTH_SEMANTICS prima di eseguire il DDL oppure modificare il DDL per aggiungere CHAR a ogni dichiarazione di colonna VARCHAR2. Quando esegui l'importazione, dovrai solo dirlo per ignorare l'errore delle istruzioni CREATE TABLE poiché le tabelle già esistono.
Grotta di Giustino,

Ho cambiato la definizione della mia tabella ... VARCHAR2 (60 CHAR) NOT NULL ... e ho usato IMP con IGNORE = Y e Import terminato con successo con avvertenze.
bernd_k,

4

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. Vedi qui per altri possibili problemi di troncamento dei dati


Vedi la mia modifica. La mia unica speranza è di creare prima le tabelle con larghezza estesa e di importare i dati ignorando le tabelle create dall'importazione.
bernd_k,

stai usando impdp? guarda qui per come
Jack dice di provare topanswers.xyz

non ancora, ma forse un buon momento per imparare.
bernd_k,

ma nota che impdp può essere usato solo con le esportazioni create con expdp
Jack dice che prova topanswers.xyz


0

Questo ha funzionato per me. Invece di questo:

imp u/p@db file=data.dmp

Prova qualcosa del genere in bash:

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

Questo cambia ogni col1 VARCHAR2(n)a col1 VARCHAR2(n CHAR)in linee a cominciare CREATE TABLE. Potresti anche cambiare data.dmpprima di eseguire imp su di esso, se non sei in grado <(...)nella 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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.