Frage

Ich habe 2 Datenbanken und Ich mag eine vorhandene Tabelle transportieren eine CHAR-Spalte von Datenbank A zur Datenbank B enthalten.

Datenbank A ist Oracle 9i, Codierung WE8ISO8859P1 hat und enthält eine Tabelle "foo" mit mindestens 1 Spalte des Typs CHAR (1 Zeichen). Ich kann nicht in die Tabelle auf Datenbank A ändern, weil es Teil eines Dritten Setup ist.

Datenbank B Eigene Oracle 10g Datenbank unter Verwendung kodieren AL32UTF8 für alle Arten von Gründen, und ich möchte foo in diese Datenbank kopieren.

ich ein Setup Datenbankverbindung aus der Datenbank B Datenbank A. Dann Ausgabe ich den folgenden Befehl ein:

* create table bar als select * from # link # .foo; *

Die Daten werden kopiert schön, aber wenn ich die Typen der Spalten überprüfe, merke ich, dass CHAR (1 Zeichen) in CHAR (3 Zeichen) umgewandelt wurde, und wenn die Daten in der Datenbank B abfragt, es ist alles mit Leerzeichen aufgefüllt.

Ich denke, irgendwo unter Wasser, Oracle verwirrt es eigenes Bytes und Zeichen ist. CHAR (1 Byte) unterscheidet sich von CHAR (1 Zeichen) usw. Ich habe über alles, was zu lesen.

Warum funktioniert der Datentyp Änderung in einem gepolsterten CHAR (3 Zeichen) und wie kann ich aufhören Oracle dies zu tun?

Edit: Es scheint, mit Übertragung Chars zwischen zwei bestimmten patchlevels von Oracle 9 und 10. Es sieht aus, um zu tun, wie es wirklich ein Fehler ist. sobald ich herausfinden, werde ich ein Update veröffentlichen. Inzwischen: nicht versuchen, Chars zwischen Datenbanken zu bewegen, wie ich beschrieben. VARCHAR2 funktioniert (getestet).

Edit 2: fand ich die Antwort und erzielte hier: Warum Char (1) Änderung Char (3), wenn eine Oracle dBLINK Kopieren über? Schade, dass ich nicht meine eigene Antwort akzeptieren, weil mein Problem gelöst ist.

War es hilfreich?

Lösung

Dieses Problem wird durch die Art und Weise Oracle (mis) verursacht wird, behandelt Zeichenkonvertierung zwischen verschiedenen Zeichensätzen auf der ursprünglichen Spaltenlänge Definition basiert. Wenn Sie die Größe eines Zeichentypspalte in Bytes definieren, weiß Oracle nicht, wie eine Umwandlung zu tun und bodges es. Die Lösung ist immer die Länge eines Zeichentypen in Zeichen zu definieren .

Für eine tiefer gehende Erklärung des Problems und wie ich dachte, diese aus einen Blick auf http://www.rolfje.com / 2008/11/04 / Transport-oracle-Zeichen-over-a-dblink /

Andere Tipps

Sie müssen die Differenz zwischen dem WE8ISO8859P1 NLS lernen und der AL32UTF8 (die Zeichen in einem Byte gespeichert werden), die Zeichen in bis zu vier Bytes speichert. Sie müssen einige Zeit mit der Oracle National Language Support (NLS) Dokumentation . Oracle tut automatisch die Konvertierung durch die Datenbankverbindung, in einem Versuch, hilfreich zu sein.

Versuchen Sie Folgendes aus Ihrer SQL-Eingabeaufforderung:

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

Das erste, was ich versuchen würde, Erstellen der Tabelle nicht als CTAS aber mit einer Liste von Spaltendefinitionen und versuchen, einen Einsatz der ersten paar tausend Zeilen auszuführen. Wenn das nicht gelingt, dann wäre es ganz klar, warum ... und würden Sie schnelle Bestätigung haben, dass Thomas Low tot auf genau ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top