[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]