[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Dec 2009
    Beiträge
    43

    PDO Problem CCSID

    Hallo,

    das Thema wurde zwar schon oft behandelt, ich habe es jedoch noch nicht verstanden.

    Ich frage mittels PHP und PDO über ODBC Daten aus der iSeries ab, welche ich dann in HTML ausgeben und bereitstellen möchte
    Die Quelldatei hat dei CCSID 273 (laut DSPFD).

    In meiner PDO-SQL Abfrage habe ich nun (AUSZUG):

    SELECT CAST(CAST(ARTIKELSTAMM.ASARB1 AS VARCHAR(50) CCSID 65535) AS VARCHAR(50) CCSID 870)... stehen.

    Diese Möglichkeit der CASTs habe ich hier im Forum gefunden. Es funktioniert nur leider nicht so wie gewünscht:

    Ohne die CASTs hatte ich statt eines "ü" ein "?".
    Mit den CASTs habe ich nun statt eines "ü" ein "}".

    Für Windows (ANSI) sollte man je eigentlich die CCSID 1252 verwenden, da bringt PDO aber einen Fehler.
    Habe schon mehrere CCSIDs von der Seite probiert:
    http://www-01.ibm.com/software/globa...egistered.html
    Leider ohne Erfolg.

    Hat jemand eine Idee, wie ich das Problem lösen könnte?

    Gruß, watchdogg

  2. #2
    Registriert seit
    Jul 2005
    Beiträge
    1.053
    Kann mich irren aber bei Windows geht doch auch CCSID 1208 oder nicht ?



    Gruß AS400.lehrling

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Du vergisst bei SQL noch die Umwandlung in deine Ziel-CCSID (hier Codepage).
    Dein SQL-Job läuft mit der CCSID der Sprache deines angemeldeten Users bzw. des Systems.
    Im Zweifel also 273 (DSPJOB QZDASOINIT)!
    Du castest also 2 x, 1. in Hex, 2. in 870. Soweit so gut.
    Da dein ODBC aber in einer ANSI-Umgebung läuft muss ja nun von 870 in (z.B.) 1252 gewandelt werden. Da deine Daten aber in 870 sind, dein Job aber 273, wird nun von 273 nach 1252 gewandelt.
    Dazu wandelt nun SQL vorher von 870 in 273. Da hier der Zwischenschritt über 65535 fehlt, erfolgt nun die Codeverschiebung!

    Du benötigst ganz einfach einen 3. (outer) Cast in UCS2:
    cast( as vargraphic(nn) ccsid 13488)

    Dann erhältst du in deinem PHP direkt den Unicode-String.
    Alternativ kannst du auch in varchar(nn * 2) ccsid 1208 in UTF-8 umwandeln.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  4. #4
    Registriert seit
    Dec 2009
    Beiträge
    43
    Hallo Fuerchau,

    also bis zu "Soweit so gut." kann ich dir folgen.
    Den 3. outer CAST habe ich so gemacht:

    CAST(CAST(CAST(ARTIKELSTAMM.ASARB1 AS VARCHAR(50) CCSID 65535) AS VARCHAR(50) CCSID 870) AS VARGRAPHIC(50) CCSID 13488)

    Deinen 2. Vorschlag mit VARCHAR(nn * 2) so:

    CAST(CAST(CAST(ARTIKELSTAMM.ASARB1 AS VARCHAR(50) CCSID 65535) AS VARCHAR(50) CCSID 870) AS VARCHAR(100) CCSID 1208)

    Das Ergebnis ist immer das gleiche --> statt einem "ü" kommt ein "}". Ich weiß auch nicht, was du mit VARGRAPHIC meinst.

    In den Meta-Tags meiner HTML5-Seite habe ich nochmal explizit utf-8 angegeben.

    Ich weiß echt nicht weiter.

    Gruß, watchdogg

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    OK, dann noch mal anders herum:
    Bist du sicher, dass die Daten in deiner Tabelle tatsächlich 870 (Polnisch sind)?
    Welche CCSID hat deine Tabelle?
    Welche CCSID hat dein QZDASOINIT-Job?

    UCS2 wird per VARGRAPHIC(NN) CCSID 13488 definiert.

    Was bekommst du denn wenn du den ganzen Cast weglässt und das Feld direkt nimmst?
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Dec 2009
    Beiträge
    43
    Danke für deine Geduld.

    Eins Vorweg:
    Ich kenne mich auf der iSeries kaum aus. Mache nur DB-Abfragen auf physische Dateien aus Windows heraus. Oder auch mit STRSQL.

    Die Tabelle ist nicht polnisch. Die 870 habe ich nur testweise genommen.
    Tabellen CCSID ist 273.
    Wo genau finde ich die CCSID bei "DSPJOB QZDASOINIT"?

    Wenn ich die CASTS komplett weglasse bekomme ich statt eines "ü" ein "?".

    Gruß, watchdogg

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Den QZDA-Job findest du per "WRKOBJLCK USERNAME *USRPRF".
    Dann kannst du in diesem QZDA-Job die CCSID prüfen.
    Nun kenne ich dein PDO nicht. Für PHP gibt es aber eine kostenlose i5-Library, mit der du direkt per i5-Objekten zugreifen kannst.
    Vielleicht macht PDO da mit den Feldtypen CHAR bzw. bei UCS2 WCHAR im Ergebnis was falsch.

    Wenn du Excel hast, prüfe mal ob du die Daten per MS-Query (Externe Daten) per ODBC korrekt nach Excel bekommst.

    Ansonsten ist hier tatsächlich nur raten angesagt.
    Entscheidend ist die Art, wir die Daten in die Tabelle kommen um den korrekten Code zu ermitteln.
    Wenn die Tabelle 273 hat erwarte ich nun mal deutsch beim Select per ODBC.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  8. #8
    Registriert seit
    Dec 2009
    Beiträge
    43
    Hallo Fuerchau,

    ich habe den Befehl von dir eingegeben und bin an folgende Infos gekommen:

    ID des codierten Zeichensatzes (CCSID) : 65535
    Standard-ID des codierten Zeichensatzes : 273

    In den ODBC Einstellungen könnte ich gegebenenfalls noch was schrauben.
    Die momentanen Einstellungen sind:
    Click image for larger version. 

Name:	settingsODBC.png 
Views:	74 
Size:	85,7 KB 
ID:	288

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    OK, das ist soweit mal wieder typisch.
    Für SQL wird die Standard-ID, also 273 verwendet, da die CCSID eben nicht festgelegt ist.
    Die ODBC-Umsetzung von Binärdaten ist nur erforderlich, wenn du per SQL Dateien verarbeitest, dessen Felder keine CCSID haben, aber keine Binärdaten sind.
    Dies ist aber in so fern gefährlich, wenn tatsächlich mal Binärdaten vorliegen. Ich speichere z.B. Bilder (jpg's, wmf's, usw.) in einem BLOB auf der AS/400, da wäre eine Umsetzung fatal.

    Da du aber in den Dateien au der AS/400 ja wohl 273 hast, sollte eigentlich eine spezielle Konvertierung überhaupt nicht erforderlich sein.

    Hierzu kannst du wirklich am Besten per Excel mit "Externen Daten" per ODBC mit MS-Query dir Daten von der AS/400 per SQL ansehen bis es klappt.

    Wie kommst du überhaupt auf die Konvertierung mit 870 (Polnisch)?
    Dies ist nur erforderlich, wenn mal wieder jemand polnische Zeichen in eine deutsche Tabelle erfasst hat. Dann sollte sowas aber über eine View mit CASE-Konstrukten in UCS2 gewandelt werden.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  10. #10
    Registriert seit
    Dec 2009
    Beiträge
    43
    Also die 870 ist ursprünglich aus Unwissenheit in Verbindung mit copy+paste hereingekommen. Das das Unsinn ist, weiß ich jetzt.

    Ich habe mal den Zugriff über EXCEL versucht. Dort scheitere ich aber daran, dass ich die entsprechenden phys. Files, die ich gern abfragen möchte, nicht sehe.

    In diesem Thread:
    http://newsolutions.de/forum-systemi...c+bibliotheken

    hatte schon mal jemand das Problem. Da hast du geschrieben, dass man per LIB.FILE direkt auf das File zugreifen kann. Wo kann man das bei MS-Query aus EXCEL heraus eingeben?

    Über meine Programme (PHP, Delphi, .NET) klappt der Zugriff mit LIB.FILE ja auch. Da verwende ich auch den gleichen ODBC-DSN wie ich bei MS-Query verwenden möchte.
    Wie kann ich denn die Files in EXCEL sichtbar machen?

    Achso, Zugriff erfolgt immer als QPGMR.

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Um die Dateien/Libs zu sehen muss man in der ODBC-Konfig die Lib's einfach durch Leerzeichen getrennt aufführen.
    Ansonsten wählt man im MS-Query-Wizzard irgend eine sichtbare Tabelle aus, geht so lange weiter bis die Auswahl "Mit MS-Query bearbeiten" erscheint und ruft MS-Query auf.
    Hier schaltet man dann in die SQL-Sicht.
    Dies ist ein "blödes" Textfenster in dem man native SQL's erfassen kann.
    Ggf. gibt MS-Query noch aus, dass der SQL eben nicht grafisch dargestellt werden kann, dies kann man aber getrost vernachlässigen.
    Die Vorschaudaten werden dann angezeigt.
    Hier darf man sich bei Sonderzeichen ggf. nicht verwirren lassen, da MS-Query keinen Unicode-Font verwendet (warum auch immer noch nicht).
    Bei der Rückgabe in Excel werden die Daten dort aber korrekt (falls CCSID's passen) dargestellt.
    In Excel kann man dann auch jederzeit die Abfrage wieder bearbeiten und modifizieren.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. CCSID zu x ten mal
    By Robi in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 15-08-14, 17:22
  2. UTF-8, XML, IFS CCSID und SAX
    By Robi in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 25-04-14, 15:16
  3. CHG CCSID ?
    By Liebhoff in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 04-09-02, 10:27
  4. CCSID 65535
    By Atomik in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 02-08-02, 15:01
  5. CCSID Problem
    By Arbi in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 13-10-01, 12:59

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •