[PHP-users 34225] PDOStatement::fetch(): column x data was too large

HOTTA Michihide hotta @ net-newbie.com
2008年 12月 25日 (木) 15:17:19 JST


堀田@長崎市です。

# なんか流れないようなので再送です。2通いってしまったらすみません。

Creole が開発終了になってしまったので、遅まきながらいろんなアプリ
を PDO に移行しています。ついては、pdo_sqlite とか pdo_oci とかを
有効にした Cent OS 5.2 向けの PHP の RPM パッケージを作ってみまし
たので、必要な方は参考にしてみてください。これで、まともに動いて
いなかった「PHP5徹底攻略」のサンプルも息を吹き返してくれるとよい
のですが(汗)。

  http://net-newbie.com/support/
  http://yum.net-newbie.com/5/

さて本題ですが、Oracle へのアクセス部分を pdo_oci に置き換えたと
ころ、以下のような警告が発生しました。

PHP Warning:  PDOStatement::fetch(): column 1 data was too large 
for buffer and was truncated to fit it in
/var/samba/lc_view/progs/import_normal2.php on line 61

該当の行は以下のようになっています:

$ cat -n import_normal2.php | head -61 | tail -1
    61  while($ar = $ora_stmt->fetch(PDO::FETCH_ASSOC))   {

ぐぐってみると、以下のエントリが見つかりました。まさにこのまんま
の状況のようです。

  http://makisuke.seesaa.net/article/107168424.html

(以下、引用させていただきます)
> SJIS->全角2バイト、UTF8->全角3バイト、というところに原因がある
> ようで、Oracle(SJIS)側でVARCHAR2(10)となっているカラムに全角5
> 文字(10バイト)が入っていると、Clientで受け取る際は15バイトと
> なる。PDO側ではOracleのカラムサイズだけを見てバッファを用意し
> ているらしく、バッファが10バイトしか用意されないため「バッファ
> 容量を超えた」という判断をするらしい。

手元の環境では、プログラム(バッチ)の実行に先立って

  export NLS_LANG=American_JAPAN.AL32UTF8

を行っています。この状態で SQLplus から SQL を発行する場合はうま
いっています。できれば PDO でも UTF-8 のままで取り出したいのです
が、何かよい方法(or ネ申パッチ?)があればご教示ください。

環境:
DB : Oracle 10g
Client : Cent OS 5.2
$ rpm -qa|grep -e ^php -e ^ora|sort
oracle-instantclient-basic-10.2.0.3-1
oracle-instantclient-sqlplus-10.2.0.3-1
php-5.2.8-4.npuc
php-cli-5.2.8-4.npuc
php-common-5.2.8-4.npuc
php-ldap-5.2.8-4.npuc
php-mbstring-5.2.8-4.npuc
php-oci8-5.2.8-4.npuc
php-pdo-5.2.8-4.npuc
php-pear-1.4.9-4
php-pear-Auth-SASL-1.0.2-4.el5.centos
php-pgsql-5.2.8-4.npuc

-- 
HOTTA Michihide <hotta @ net-newbie.com>


PHP-users メーリングリストの案内