Anmelden

View Full Version : SQL resultset --> PHP encoding



Albert Mayr
29-04-13, 13:47
Hallo!

Folgendes SQL läuft im Navigator problemlos und liefert das gewünscht Ergebnis:
SQL
select fir, '00010101' as trm#, 'L' as rsar, msas, manr, mfbn, mgrs, dspb, sum(mbtv+mbzu-mbab) as Menge
from libx.filex where ...
group by fir, msas, manr, mfbn, mgrs, dspb

Ergebnis:
Firma TRM# RSAR Mat.-Saison
001 00010101 L 58

Wenn ich nun das Ergebnis als Result-Set in PHP auslese sind TRM# und RSAR unlesbare Zeichen:

<table border="0" width="980"><tbody><tr><td bgcolor="#999999">MSAS</td><td bgcolor="#999999">
</td><td bgcolor="#999999">
</td><td bgcolor="#999999" align="right">Termin</td><td bgcolor="#999999" align="right">Status</td><td bgcolor="#999999" align="right">
</td><td bgcolor="#999999" align="right">
</td><td>
</td><td>
</td></tr><tr style="background-color: white;"><td>58</td><td>
</td><td>
</td><td>ñ.ð.ðð</td><td>Ó</td><td align="right">
</td><td align="right">
</td></tr><tr style="background-color: white;"><td>58</td><td>
</td><td>
</td><td>ñ.ð.ðð</td><td>Ó</td><td align="right">
</td><td align="right">
</td></tr><tr style="background-color: rgb(221, 221, 221);"><td>58</td><td>
</td><td>
</td><td>ñ.ð.ðð</td><td>Ó</td><td align="right">
</td><td align="right">
</td></tr></tbody></table>

Die Ergebnisfelder TRM# und Art konvertiere ich mit trim(mb_convert_encoding(db2_result($result, 'TRM#'),"UTF-8","ISO-8859-1"));

Vielen Dank für eure Hilfe

Pikachu
29-04-13, 13:59
Irgendwo fehlt da wohl noch die Konvertierung von EBCDIC nach ASCII oder UTF-8.

andreaspr@aon.at
29-04-13, 14:27
Wenn ich das richtig sehe, gibst du den Wert '00010101' schon im PHP-Skript im SELECT mit an.
Eventuell ist es schon UTF-8, dann brauchst du auch keine Konvertierung mehr machen.

lg Andreas

Fuerchau
29-04-13, 14:33
Dies ist ein Problem der nicht vorhandenen CCSID (*HEX bzw. 65535) auf den Zeichenfeldern der Datenbank.

Schau mal in die i5_Connect-Properties, ob du eine Einstellung für "Convert 65535=true" findest und wende diese an.

Alternativ hilft auch ein Cast:

select cast(TRM# as char(nn) ccsid 273) as TRM# ...

Alternativ auch zusätzlich in Unicode:

select cast(cast(TRM# as char(nn) ccsid 273) as grphic(nn) ccsid 13488) as TRM# ...

mk
29-04-13, 17:37
Hallo,

die Jobs von PHP laufen im Subsystem QSYSWRK
Z.B.:
Job: QSQSRVR Benutzer: QUSER Nummer: 335650

evtl. prüfen mit welchem Zeichensatz der Job läuft.

Gruß
Michael

Fuerchau
29-04-13, 20:18
Ein SQL-Serverjob hat immer eine CCSID!
Steht der Systemwert auf 65535 wird die CCSID aus der Sprach-ID (User oder Systemwert) entwickelt.
Da ODBC ja in ANSI/ASCII umwandeln muss, wird immer eine CCSID eingestellt.
Hier steht wohl die Datei bzw. die Felder auf CCSID *HEX, was eine automatisch Codewandlung verhindert.
In den ODBC/JDBC-Treibern gibt es eine Einstellung für zwangsweises wandeln von *HEX, was im Übrigen echte Binärdaten dann verhindert. Ich speichere z.B. Bilder (jpg's u.ä.) in der DB, die natürlich nicht gewandelt werden dürfen.

Albert Mayr
30-04-13, 10:24
Danke für die ausführlichen Erklärungen.
Auf die Schnelle hab ich das mit dem CAST gelöst - die Einstellungen im I5_Connect werde ich mir bei Gelegenheit mal ansehen.