Datenverlust über Datenbank-Link

Gerade bin ich mal wieder auf ein altes, aber stets aktuelles Thema gestoßen worden: Internationalisierung („Globalization“ im Oracle-Sprech).

In diesem speziellen Fall geht es um ein Szenario, bei dem Daten über einen DB-Link abgefragt werden. Dabei gehen einige Sonderzeichen verloren, die in der Quell-DB aber zu sehen sind. Hier eine kurze Zusammenfassung des Szenarios:

  1. DB „ORC1“ hat einen DB-Link zu „ORC2“.
  2. Tabellenspalte „ename“ enthält Sonderzeichen, z.B. „´“ (Akut).
  3. Abfrage der Spalte aus ORC1 mit „SELECT ename FROM emp@orc2;“
  4. Das Sonderzeichen wird bei dieser Abfrage nicht angezeigt.
  5. ORC1 hat den Zeichensatz WE8ISO8859P15, ORC2 WE8ISO8859P1.

Der Grund, weshalb das Sonderzeichen auf dem Weg über den Link verloren geht, liegt in den unterschiedlichen Zeichensätzen. Metalink Note 121627.1 beschreibt die Unterschiede und zeigt, daß im neueren P15-Zeichensatz einige Zeichen des P1-Zeichensatzes (z.B. gegen das Euro-Symbol) ersetzt wurden.

Eine kleine Aufstellung der Unterschiede zwischen den beiden Zeichensätzen:

Hex  |  WE8ISO8859P1 (ISO Latin 1)  |  WE8ISO8859P15 (ISO Latin 9)
Code |  Beschreibung                |  Beschreibung
-----+------------------------------+------------------------------------
A4   |  Währungssymbol (¤)          |  EURO-Symbol (€)
     |                              |
A6   |  Vertikaler Balken (¦)       |  Großes S mit Hatschek (Š)
     |                              |
A8   |  Trema (¨)                   |  Kleines s mit Hatschek (š)
     |                              |
B4   |  Akut  (´)                   |  Großes Z mit Hatschek (Ž)
     |                              |
B8   |  Cedille  (¸)                |  Kleines z mit Hatschek (ž)
     |                              |
BC   |  Ein Viertel (¼)             |  Große OE-Ligatur (Œ)
     |                              |
BD   |  Einhalb  (½)                |  Kleine oe-Ligatur (œ)
     |                              |
BE   |  Drei Viertel  (¾)           |  Großes Y mit Trema (Ÿ)
-----+------------------------------+------------------------------------

Bleibt die Frage nach einer Lösung. Die könnte in der Gegenfrage bestehen, ob man einen allein stehenden Akut denn benötigt und überhaupt zulassen sollte.

Andernfalls ist eine Angleichung der Zeichensätze angesagt. Da die Änderung eines DB-Zeichensatzes mit einigem Aufwand verbunden ist, sollte überlegt werden, gleich auf Unicode umzusteigen – der beherrscht in Version 4 immerhin 96.382 Zeichen.

Wer die Ergebnisse einer Zeichenkonvertierung auf die Schnelle prüfen will, kann das übrigens mit der SQL-Funktion „convert“:

SELECT CONVERT( '`Hallo Welt´', 'WE8ISO8859P15','WE8ISO8859P1' )
  FROM DUAL;

Weblinks

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s