Domanda

Ho 2 database e Voglio trasportare una tabella esistente contenente una colonna CHAR dal database A al database B.

Il database A è Oracle 9i, ha la codifica WE8ISO8859P1 e contiene una tabella "pippo". con almeno 1 colonna di tipo CHAR (1 carattere). Non riesco a modificare la tabella nel database A perché fa parte di un'installazione di terze parti.

Il database B è il mio database Oracle 10g, che utilizza la codifica AL32UTF8 per tutti i tipi di motivi e voglio copiarlo in questo database.

Ho impostato un collegamento al database dal database B al database A. Quindi ho emesso il seguente comando:

* crea la barra della tabella come seleziona * da # link # .foo; *

I dati vengono copiati bene, ma quando controllo i tipi di colonne, noto che CHAR (1 carattere) è stato convertito in CHAR (3 caratteri), e quando interrogo i dati nel database B, è tutto imbottito con spazi.

Penso che da qualche parte sott'acqua, Oracle confonde i propri byte e caratteri. CHAR (1 byte) è diverso da CHAR (1 carattere) ecc. Ho letto di tutto ciò.

Perché il tipo di dati si trasforma in un CHAR imbottito (3 caratteri) e come posso impedire a Oracle di farlo?

Modifica: sembra avere a che fare con il trasferimento di CHAR tra due specifici livelli di patch di Oracle 9 e 10. Sembra che sia davvero un bug. non appena lo scoprirò, posterò un aggiornamento. Nel frattempo: non provare a spostare i CHAR tra i database come ho descritto. VARCHAR2 funziona bene (testato).

Modifica 2: Ho trovato la risposta e l'ho pubblicata qui: Perché Char (1) cambia in Char (3) quando si copia su un Oracle DBLINK? Peccato che non posso accettare la mia risposta, perché il mio problema è risolto.

È stato utile?

Soluzione

Questo problema è causato dal modo in cui Oracle (mis) gestisce le conversioni di caratteri tra diversi set di caratteri in base alla definizione della lunghezza della colonna originale. Quando si definisce la dimensione di una colonna del tipo di carattere in byte, Oracle non sa come eseguire una conversione e la modifica. La soluzione è definire sempre la lunghezza di un tipo di carattere in caratteri .

Per una spiegazione più approfondita del problema e di come ho capito, dai un'occhiata http://www.rolfje.com / 2008/11/04 / che trasportano Oracle-caratteri-over-a-dblink /

Altri suggerimenti

È necessario apprendere la differenza tra NL8 WE8ISO8859P1 (che memorizza i caratteri in un byte) e AL32UTF8 che memorizza i caratteri fino a quattro byte. Dovrai trascorrere un po 'di tempo con Oracle National Language Support (NLS) Documentazione . Oracle esegue automaticamente la conversione tramite il collegamento al database, nel tentativo di essere utile.

Prova quanto segue dal tuo prompt SQL:

ALTER SESSION NLS_NCHAR WE8ISO8859P1 
create table bar as select * from #link#.foo;

La prima cosa che vorrei provare è la creazione della tabella NON come CTAS ma con un elenco di definizioni di colonne e provare a eseguire un inserimento delle prime migliaia di righe. Se non ci riuscisse, sarebbe molto chiaro perché ... e avresti una rapida conferma che Thomas Low è morto con accuratezza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top