Pages

2011年7月7日木曜日

PHP pdo_oci を利用してDB(SJIS) の時にUTF8で取得したい場合

PHPのDB接続モジュールは非常にできが悪い。。
MSSQLの時も苦労した。。

今回もや。。
もう嫌や。。
PHPで商用DBは絶対使わない方がいい(T。T

今回の原因はDBがSJISの時にvarchar2(100)なんてカラムを作成して「あ」を50文字入れる。
すると100byteいっぱいになる。

それをPHPからPDO_OCIを利用してUTF8で取得しようとする。
すると、こんなエラーが出る。

「PDOStatement::fetchAll(): column ** data was too large for buffer and was truncated to fit it in ***」

バッファー容量より大きいぞ。っていう内容だと思う。
調べてみるとどうやらPDOがデータを取得しようとした際にDB側の情報を見てバッファ容量を確保する。
しかしこの際にDBはSJISでUTF8でデータくれっって言ってるんだから、1.5倍するとかしてバッファ確保しないと取得できないに決まっている。
しかしそこは全く考慮せずに普通にDB側で200byteなので、200byteしか用意しない。。
結果容量足らずにエラー。。

以下内容によって対応可能だが、これやっちゃうとSJIS ORACLE専用のモジュールになっちゃう。。


# cd ext
# cd pdo_oci
# vi oci_statement.c
510行目付近
col->maxlen = data_size;

col->maxlen = data_size*1.5;
# ./configure
# make
# make install

Followers