PDA

View Full Version : Zeichenumsetzung zwischen CCSID 273 und CCSID 8612 ungültig



schatte
08-02-11, 14:28
Hallo *ALL,

ich habe hier eine Tabelle mit Character Feldern, die mit der CCSID 273 angelegt wurden.

Mein Job hat die Codepage 8612 (Arabic). Damit möchte ich nun auf die oben genannte Tabelle SQL-Abfragen ausführen. Sobald ich jedoch ein Alpha-Feld auf SPACE (where xxx = ' ') abfrage, bekomme ich folgende Fehlermeldung:

Nachrichten-ID . . . . : SQL0332 Bewertung . . . . . . : 30
Nachrichtenart . . . . : Diagnose

Nachricht . . . : Zeichenumsetzung zwischen CCSID 273 und CCSID 8612
ungültig.
Ursache . . . . : Es wurde versucht, eine Zeichen- oder Grafikumsetzung für
nicht verträgliche Daten durchzuführen. Eine Umsetzung zwischen CCSID 273
und CCSID 8612 ist nicht definiert.
Ist eine CCSID 65535, ist die andere CCSID eine Grafik-CCSID. Die
Umsetzung zwischen der CCSID 65535 und einer Grafik-CCSID ist nicht
definiert.
Handelt es sich um eine Anweisung CONNECT, ist die Umsetzung zwischen der
Standard-SBCS-CCSID des Anwendungs-Requesters und der SBCS-CCSID des
Anwendungsserver nicht definiert. Ist die zweite CCSID 0, wurde die
Standard-SBCS-CCSID des Anwendungsservers nicht zurückgegeben. Ein
Anwendungsserver, der kein System i-Anwendungsserver ist, unterstützt die
CCSID 65535 möglicherweise nicht.
Fehlerbeseitigung: Sicherstellen, dass jeder Zeichen- oder Grafikvergleich,
jede Zeichen- oder Grafikverknüpfung und jede Zeichen- oder Grafikzuordnung
zwischen Spalten oder Host-Variablen erfolgt, die verträgliche CCSID-Werte
haben.
Handelt es sich um eine Anweisung CONNECT, entweder die SBCS-CCSID des
Anwendungs-Requesters oder des Anwendungsservers ändern, damit die
Umsetzung zwischen den CCSID-Werten definiert ist. Wenn ich die genannten Character Felder auf UCS-2 (CCSID 13488) umstelle, funktioniert alles.

Gibt es eine Lösung für dieses Problem, ohne alle Felder auf UCS-2 umstellen zu müssen?

Gruß
Matthias

Fuerchau
08-02-11, 14:49
Nun ja, im Prinzip hast du die Lösung ja gefunden.
Die CCSID's sind leider nicht kompatibel.
Du musst also
a) die Tabelle auf UCS2 ändern
b) im SQL auf UCS2 casten

zu b)

cast(feld as vargraphic(nnn) ccsid 13488)

Bedenke aber, dass beim Umwandeln in deine Programmvariable, sollte diese nicht mit "C" definiert sein, Umwandlungsverluste (z.B. Umlaute o.ä.) auftreten.

Auch das Schreiben in die DB mit inkompatiblen CCSID's geh nur über UCS2, ohne Verluste auch nur, wenn die Tabelle UCS2 hat.

Das Casten auf Key-Felder zwingt SQL dann auch immer zu einem Table-Scan !!!

B.Hauser
08-02-11, 15:15
Hast Du versucht auf die Tabelle eine View zu legen, in der die alphanumerischen Felder in Unicode konvertiert werden und anschließend diese View zu verwenden?

Birgitta

Pikachu
08-02-11, 15:35
Mal so versuchen:


SELECT * FROM Datei WHERE HEX(Feld) = HEX(SPACE(LENGTH(Feld)))

Fuerchau
08-02-11, 16:30
Mal so versuchen:


SELECT * FROM Datei WHERE HEX(Feld) = HEX(SPACE(LENGTH(Feld)))

Die Where-Abfrage ist nicht das eigentlich Problem sondern der anschließende Fetch der Daten.
Beim Lesen der Daten wird eine Umwandlung zwischen den CCSID's abgelehnt.

Wenn der SQL mit Hostvariablen ausgeführt wird, muss der Inhalt von der Job-CCSID in die DB-CCSID gewandelt werden.
Auch dies scheitert aus den selben Gründen.
Es funktioniert nur mit UCS2, wenn die Hostvariablen dann auch UCS2 (Typ C) sind.

schatte
08-02-11, 17:36
Nach den Antworten schließe ich, dass eine Umstellung der Felder auf UCS-2 die sauberste Möglichkeit für dieses Problem ist (gerade wegen der Performance).

Danke für eure Hilfe!

Gruß
Matthias