Ext JS に関しては,新しい記事は Sunvisor Lab. ExtJS 別館 にあります。そちらもよろしくお願いいたします。

xFrameworkPXとOracleとUTF8で

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倍に太ってしまった文字列が入ってきたので上記のエラーが出たようです。

猫ぐらし: PDO + Oracle

上記のサイトでは,Oracle側でテーブル定義を変えて対応したと書いてあります。

Oracleのテーブルはベンダーが開発したシステムのテーブルでおいそれと構造に手を入れるわけにはいきません。これってどうしようもないのか?と思いかけたのですが,エンコードを変えてみたら?と思いつき, config/database.pxml でエンコードを sjis に変更して,フェッチした後のデータを,

mb_convert_encoding($record['komoku_name'], "UTF-8", "SJIS-win")

てな感じで変換するようにしてみました。そしたら無事PDOのエラーは出なくなりました。全体のエンコーディングはutf8で統一しているので,モジュールの側でエンコードを変更する必要がありますが,モジュールにちゃんと書けばOKなので,これでいくことにしました。

トラックバック


URL から "-MoIyadayo" を削除してトラックバックを送信してください。
トラックバックは承認後に表示されます。