Ext JS に関しては,新しい記事は Sunvisor Lab. ExtJS 別館 にあります。そちらもよろしくお願いいたします。
xFrameworkPXとOracleとUTF8で
投稿者:sunvisor 投稿日時:2010/11/05(金) 16:59
xFrameworkPXで,Oracleにつないでいろいろやっていました。そうしたら今日,不思議なエラーが発生しました。
Oracleのテーブルからデータを取り出そうとしたとき,
Warning: PDOStatement::fetchAll() [pdostatement.fetchall]: column 1 data was too large for buffer and was truncated to fit it in
これはなに?
原因を調べようと元となるテーブルの定義を見てみた。問題のフィールドの定義は,varchar2(12)で,フェッチして取り出された配列を見てみると,漢字4文字で切れている。12÷4=3。なんかUTF-8が関係してそう。
実は,このテーブルそのものはSJISでエンコードされています。それを px の config/database.pxml でエンコードを utf8 として使っていました。PDOは元テーブルのサイズを元にバッファを用意するようで,それで12バイトしかないバッファができてしまい,そこにutf8になって1.5倍に太ってしまった文字列が入ってきたので上記のエラーが出たようです。
上記のサイトでは,Oracle側でテーブル定義を変えて対応したと書いてあります。
Oracleのテーブルはベンダーが開発したシステムのテーブルでおいそれと構造に手を入れるわけにはいきません。これってどうしようもないのか?と思いかけたのですが,エンコードを変えてみたら?と思いつき, config/database.pxml でエンコードを sjis に変更して,フェッチした後のデータを,
mb_convert_encoding($record['komoku_name'], "UTF-8", "SJIS-win")
てな感じで変換するようにしてみました。そしたら無事PDOのエラーは出なくなりました。全体のエンコーディングはutf8で統一しているので,モジュールの側でエンコードを変更する必要がありますが,モジュールにちゃんと書けばOKなので,これでいくことにしました。