2016-08-06 64 views
1

Ich verbringe Tage damit, Unicode-Zeichen (vereinfachtes Chinesisch) von einer Oracle 11g über PHP7 OCI8 zu lesen (versucht mit PDO_OCI und ODBC und auch in PHP5, gleiches Problem) auf Linux Ubuntu Server 14.04.PHP OCI8 Unicode-Zeichen aus NCHAR (Oracle 11g) nicht lesen

Das sind die Oracle 11g-Einstellungen:

NLS_LANGUAGE AMERICAN 
NLS_TERRITORY AMERICA 
NLS_CHARACTERSET WE8MSWIN1252 
NLS_SORT BINARY 
NLS_NCHAR_CHARACTERSET AL16UTF16 
NLS_COMP BINARY 
NLS_LENGTH_SEMANTICS BYTE 
NLS_NCHAR_CONV_EXCP FALSE 

Wichtige Die Tabellenspalte ich zu lesen bin versucht, als NCHAR definiert (40). ich php-7.0.8 NTS verwenden, oci8-2.0.11 (von PECL) und installiert Oracle instant

Dies ist der PHP-Code Ich verwende:

<?php 
$fp = fopen('output.txt','w'); 
$conn = oci_connect('MYUSER', 'MYPASSWORD', 'xxx.xxx.xxx.xxxx/DBTEST','AL32UTF8'); 

$query = "SELECT ABALPH FROM CRPDTA.F0101 WHERE ROWNUM <= 1 ORDER BY NULL"; 
$stid = oci_parse($conn, $query); 
oci_execute($stid, OCI_NO_AUTO_COMMIT); 

while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) { 
    fwrite($fp, $row['ABALPH']."\n"); 
} 
fclose($fp); 
?> 

Dann kann ich englischen Namen sehen aber ich bekomme in meine txt-Datei (UTF8 ohne BOM-Format) für chinesische Namen. Ich denke, das hängt mit dem NCHAR (40) -Datentyp zusammen.

Bitte beachten Sie, dass ich die Oracle-env-Variablen direkt eingestellt habe (durch Export und/oder putenv()). Wenn ich den sqlplus-Befehl verwende, kann ich lesbare chinesische Namen in eine Datei exportieren, die ich gesetzt habe. Export NLS_LANG = "SIMPLIFIED CHINESE_CHINA.ZHS16GBK"

Irgendeine Idee, wie man das löst? Ich würde es sehr schätzen! Grüße, Sergio

Antwort

0

Ich denke, dass ich die Lösung auf this post gefunden

der Artikel Kommentare Lesen, im Grunde das NCHAR Feld RAW/HEX umgewandelt werden muss:

$ query = „SELECT UTL_RAW.cast_to_raw (convert (ABALPH, 'AL32UTF8')) FROM CRPDTA.F0101 WHERE ROWNUM < = 1 ORDER BY NULL ";

Wenn Sie die OCI8-Erweiterung in PHP verwenden, müssen Sie das Hex nicht weiter in UTF8 konvertieren, da es laut dem Beitrag automatisch von PHP erstellt wird. Wenn Sie jedoch PDO_OCI verwenden, müssen Sie Ihr Hex-Feld mithilfe von hex2bin() konvertieren, bevor Sie es als UTF8-Zeichenfolge verwenden.

Hoffe, das könnte helfen.

1

In PHP OCI8 oder PDO_OCI gibt es keine native Unterstützung für NCHAR oder NCLOB. Viele Leute benutzen UTF8 heutzutage, also brauchten sie keine N * Unterstützung.