-
SQL BLOB Daten UTF-8 nach VARCHAR UTF-8 convertieren
Hallo,
ich habe das vergnügen alte UTF-8 Daten, die in einen BLOB Feld gespeichert sind zur verarbeiten.
Im folgenden Beispiel sind die Daten durch den VARBINARY simuliert.
Der CAST von 65535 nach 1208 funktioniert natürlich nicht, wäre aber das was ich benötige. Mit 273 funktioniert das CAST zwar, aber dann sind die Daten natürlich im Eimer.
PHP-Code:
SELECT CAST( CAST( VARBINARY(CAST('' as varchar(50) ccsid 1208)) as varchar(50) CCSID 65535) as varchar(50) CCSID 1208) FROM SYSIBM.SYSDUMMY1;
Hat jemand noch eine Idee wie man da ran kommt, oder bleit nur eine eigene SQL Funktion als Lösung übrig?
Grüße
Xanas
-
Du musst den VARBINARY mit 65535 casten, dann nach 1208.
Dadurch erfolgt keine Codewandlung.
-
Meinst du damit diese Zeile?
PHP-Code:
VARBINARY(CAST('' as varchar(50) ccsid 1208))
Diese Zeile simuliert wie gesagt nur die Bestandsdaten, die stehen so in dem BLOB Feld, mir geht es um die beiden CAST drum herum.
-
Genau.
Zwischen N und 65535 und 65535 und N wird keine Codewandlung durchgeführt beim Cast.
Wichtig ist zu wissen, welche CCSID das deklarierte Feld hat.
Ist dieses N musst du es nach 65535 casten, da sonst eine Codewandlung durchgeführt wird.
Ist dieses wirklich 65535 reicht ein Cast auf 1208, da es dann die Annahme von UTF8 bedeutet.
Letztlich musst du prüfen, was wirklich in dem Feld steht, z.B. mit der HEX(Feld)-Umwandung.
-
Ja genau so hab ich auch gedacht, aber wenn ich lediglich den hier versuche, werde ich diesem Fehler belohnt.
PHP-Code:
SELECT CAST( VARBINARY(CAST('!DOCTYPE html' as varchar(50) ccsid 1208)) AS VARCHAR(50) ccsid 1208) FROM SYSIBM.SYSDUMMY1;
// Das ist was ich eigentlich machen möchte, das VARBINARY ist nur das was in meinem Feld steht, habe ich auf HEX geprüft.
SELECT CAST(MY_BLOB_FIELD AS VARCHAR(50) ccsid 1208) FROM txk01pf;
Anbietercode: -332
Nachricht: [SQL0332] Zeichenumsetzung zwischen CCSID 65535 und CCSID 1208 ungültig. Ursache . . . . : Es wurde versucht, eine Zeichen- oder Grafikumsetzung für nicht verträgliche Daten durchzuführen. Eine Umsetzung zwischen CCSID 65535 und CCSID 1208 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 DB2 für IBM 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.
-
Schau Dir mal die skalare Funktion INTERPRET an, ob Du damit weiterkommst
https://www.ibm.com/docs/en/i/7.5?to...ions-interpret
-
Ja, da gibts dann ein Beispiel sogar dafür.
INTERPRET(BX'616263' AS CHAR(3) CCSID 1208)
Alle CAST-Funktionen versuchen natürlich eine Codewandlung, wobei bisher galt, dass eine Binary-CCSID wie 65535 nicht gewandelt wird. Nun sehe ich da die Fehlermeldung, dass 1208 und wahrscheinlich auch 1200 davon ausgenommen sind.
Interpret gibts allerdings erst ab V7R3.
Ansonsten hilft nur eine eigene externe SQL-Funktion, in der du per Overlay-DS Daten anders interpretieren kannst.
-
INTERPRET hatte ich auch schon gequält, aber der ist es!
Mein Problem war, ich hab VARCHAR statt CHAR verwendet.
SELECT
RTRIM(INTERPRET(TKFLT1 AS CHAR(32000) CCSID 1208))
FROM txk01pf;
Dankeschön für die Hilfe
-
Varchar hat eine 2/4-Byte-Längeninformation am Anfang.
Da kann man sich ja nun auch die geschachtelten CCSID-Cast endlich mal sparen.
Einfach nur noch:
INTERPRET(MyChar273 as CHAR(nn) CCSID 1142).
Similar Threads
-
By wilfried in forum NEWSboard Programmierung
Antworten: 1
Letzter Beitrag: 12-10-17, 10:09
-
By uditzen in forum NEWSboard Programmierung
Antworten: 1
Letzter Beitrag: 26-06-15, 10:03
-
By alfredo in forum IBM i Hauptforum
Antworten: 0
Letzter Beitrag: 28-11-06, 11:43
-
By magdalena in forum NEWSboard Programmierung
Antworten: 8
Letzter Beitrag: 08-03-06, 15:42
-
By harkne in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 18-11-05, 10:06
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks