PDA

View Full Version : %substr eines UTF16 Feld



inchic
28-01-10, 13:02
Hallo *all,

ich habe folgendes Problem:
Datei mit dem FELd: TEXT1 G 502 CCSID(1200) gefüllt mit chinesischen zeichen

D feld1 S 15000CCCSID(1200)

nach dem select auf die Datei in meinem programm, möchte ich folgendes machen:

%subst(feld1:1:L)= %subst(text1:1:L);

hier stürzt das Programm ab mit der Meldung: "Länge oder Anfangsposition liegt außerhalb des gültigen Bereichs für die Zeichenfolgeoperation"

Kann mir jemand hier das Problem schildern?

DANKE!

Fuerchau
28-01-10, 20:28
Da UTF16 ein variables Format ist (2 oder 4 Byte), funktioniert %subst da leider nicht.
Hier musst du einen Umweg über UCS2 (13488) machen (fix 2 Byte).

%subst(% UCS2(TEXT1:1:L))

Probiert habe ich das allerdings noch nicht.

UTF16 und auch UTF8 sollte nur als Import/Export-Datentyp verwendet werden.
UCS2 sollte bei der Datenhaltung und Programmierung verwendet werden.

Es wäre also besser, die Daten beim Select in eine UCS2-Variable zu lesen und dann eben auch per Update/Insert zu schreiben.

Variable Zeichensätze (UTF8, UTF16) sollten datenbanktechnisch auch als VARCHAR/VARGRAPHIC definiert und Leerzeichen am Ende immer abgeschnitten werden (Trim).
Es könnte nämlich sonst passieren, dass beim Schreiben die Daten zu lang werden.

Ich hatte da mal das Problem mit Oracle:

LagerNr varchar2(2)

varchar2 ist bei Oracle immer UTF8.

Leider kam der Anwender auf die Idee, das Lager "ÜL" zu nennen, für UTF8 werden aber 3-Byte benötigt. Und schon gabs SQL-Fehler!

Wenn man also mit UTF8 bzw. UTF16 arbeitet sollte man die 4 bzw. 2-fache Kapazität in der DB planen und die Eingabe entsprechend beschränken.

inchic
29-01-10, 07:32
DANKE!!!

und ein schönes Wochenende noch!

inchic
10-02-10, 19:59
das hat fuktioniert. ich konnte es aber besser lösen indem ich schon im SQL-stmt den substring auf das utf16-feld durchgeführt habe. Bsp: select substring(feld1,1,:x) from.... Dies hat mir das hin und her convertieren erspart.
Hätte gleich darauf kommen können :-)

Fuerchau
11-02-10, 07:53
Hier regelt SQL das intern selber, da auch SQL erst mal in UCS2 konvertieren muss.