[PHP-users 10249] ja16sjisデータベースとEUCクライアント組み合わせ時の問題 (OCI8)

YOSHIMURA Hideaki php-users@php.gr.jp
Thu, 19 Sep 2002 14:40:44 +0900


吉村と申します。
Oracleデータベースとの接続で、ちょっと困った問題に遭遇しました。

シフトJISのデータが格納された既存データベースに、PHPからOCI8関数で
アクセスしようと試みたのですが、あるテーブルの特定項目に限って、
出力データが壊れたり、PHPがcore dumpしてしまったりしました。

いろいろ調べてみたところ、下記のような理由でこのような現象が発生して
いるように思われました。

*前提*
 ・データベースのキャラクタセット: ja16sjis
 ・PHPスクリプトのコード         : EUC-JP
 ・環境変数 NLS_LANG の設定値    : japanese_japan.ja16euc
 取得するカラムに半角カナ文字が含まれる

上記のような場合に、半角カナのバイトサイズの違い(シフトJIS=1バイト、
EUC-JP=2バイト)から、実際に取得するデータ長は、データベースでの格納
サイズより大きくなります。しかし、PHPのOCI8関数でバッファを確保する際
に、カラムのサイズを元にバッファを取得しているため、データによっては
バッファが溢れてしまう結果になっているようです。

例えば Pro*C のプログラムであれば、char配列のサイズを適当に増やせば
回避できるわけですが、PHPの場合はそういうわけにもいかず、どうしたもの
か…と困っている状態です。

 ・oci_execute() に手を入れて、カラムサイズを倍に見せかける
 ・ja16sjis でデータ取得して mb_convert_encoding する
 ・スクリプトをシフトJISで書き直す

以上のような回避策以外に、なにか解決策はあるでしょうか。
また、何か私が勘違いをしているようでしたら、ご指摘いただけると幸いです。


<<サーバ>>
 HP-UX B.10.20
 Oracle7 Server Release 7.3.4.4.1 With the distributed and parallel query options

<<クライアント>>
 Miracle Linux 2.0 (2.4.7-2.20ml)
 Oracle Call Interface 9.0.1.0.0

--------------------
吉村 英明 / 中央システム株式会社 アプリケーション事業部 山口システム課
→[mailto:hyoshimu@yam.chuosystem.co.jp]