[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使ってます。。
////////////////////////////