2016-08-06 8 views
1

Oracle 11gからPHP7 OCI8(PDO_OCIとODBCで試してみましたが、PHP5でも同様です)からUnicode文字(簡体字の中国語名)同じ問題)Linux Ubuntuサーバー14.04で。PHP OCI8 NCHAR(Oracle 11g)からUnicode文字を読み込むことができません

これは、Oracle 11gの設定です:私は読んしようとしている

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 

重要なテーブルの列がNCHAR(40)と定義されます。

<?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); 
?> 

は、その後、私は英語の名前を見ることができます: 私は、PHP-7.0.8 NTSを使用し、(PECLから)とoci8-2.0.11は、Oracle instantclientに

をインストールこれは私が使用しているPHPのコードがあります私は中国語の名前のために私のtxtファイル(UTF8 w/o BOM形式)に¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿私はこれがNCHAR(40)データ型に関連していると思います。

私はOracle env変数を直接(エクスポートおよび/またはputenv()を通じて)設定しました。 sqlplusコマンドを使用すると、読み取り可能な中国語の名前をファイルにエクスポートできます。export NLS_LANG = "SIMPLIFIED CHINESE_CHINA.ZHS16GBK"

これを解決する方法はありますか?私は大いに感謝しています!私は記事のコメントを読むthis post

に解決策を見つけたと思う よろしく、セルジオ

答えて

0

は、基本的にNCHARフィールドはRAW/HEXに変換する必要があります

$クエリ=「SELECT UTL_RAW.cast_to_raw (変換(ABALPH、 'AL32UTF8'))FROM CRPDTA.F0101 WHERE ROWNUM < = 1 ORDER BY NULL ";

PHPでoci8拡張機能を使用している場合は、ポストによると、PHPによって自動的に行われるため、16進数をUTF8にさらに変換する必要はありません。ただし、PDO_OCIを使用する場合は、hex2bin()を使用して16進数フィールドを変換してからUTF8文字列として使用する必要があります。

これが役に立ちます。

1

PHP OCI8またはPDO_OCIにNCHARまたはNCLOBのネイティブサポートはありません。今日はUTF8を使用している人が多いので、N *のサポートは必要ありません。

関連する問題