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

Shoichi php-users@php.gr.jp
Thu, 19 Sep 2002 18:03:20 +0900


留場です。

こんにちは。

On Thu, 19 Sep 2002 14:40:44 +0900
YOSHIMURA Hideaki <hyoshimu@yam.chuosystem.co.jp> wrote:

> 吉村と申します。

>  ・データベースのキャラクタセット: ja16sjis
>  ・PHPスクリプトのコード         : EUC-JP
>  ・環境変数 NLS_LANG の設定値    : japanese_japan.ja16euc
>  取得するカラムに半角カナ文字が含まれる
> 
> 上記のような場合に、半角カナのバイトサイズの違い(シフトJIS=1バイト、
> EUC-JP=2バイト)から、実際に取得するデータ長は、データベースでの格納
> サイズより大きくなります。しかし、PHPのOCI8関数でバッファを確保する際
> に、カラムのサイズを元にバッファを取得しているため、データによっては
> バッファが溢れてしまう結果になっているようです。
はい、この場合よくあります。
perlのDBDでOCI8関数で同じようなことになったことがあります。
(core dumpはなかったですが。。)

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

> 以上のような回避策以外に、なにか解決策はあるでしょうか。

 どうしても今の構成・プログラムでやりたい時は、
 select rpad(品名,256,' ') from TMP; のように
 rpadで無理やりサイズ以上(倍:以上)を指定して、取得してプログラムで
 空白を取り除きます。
 この場合、半角カナが入って項目が多数あるとつらいですが。。

////////////////////////////
http://www.seis.co.jp
http://sho200.s16.xrea.com  :: XOOPS使ってます。。
////////////////////////////