Cent OS 4.4
PHP 4.3.x
MySQL 4.1.x
を使用しています。
データベース周りには、PEAR::DBを使用しています。
テーブルにblob型でフィールドを作り、
バイナリデータをPEAR::DBを使って入れようと試みました。
問題なく入れることが可能なファイルと、入れられないアフィルがあります。
ms accessのデータなどが入れられませんでした。
なんとなく、PEAR::DBがバイナリデータをエスケープしているためかなと思ったのですが、
詳しく調べていません。
オープンソース系でPEAR::DBを使用しているのを落としてきて、
どんな感じの処理をしているのかな?と覗いてみたのですが、
base64_encodeしているようでした。
これだと、サーバに負荷がかかっちゃうなと思ったので、
できれば、直接バイナリデータを入れられるに越したことはありません。
PEAR::DBを使用して、直接データを入れる方法があれば教えてください。
(ふと疑問:直接放り込めるようにしたとき、エスケープしないで入れたら、テキストファイルをアップされて、中にSQL文書かれたら、やばいかなとも思ったり。。。)
ファイルから読み込んだ内容に対して、一旦mysql_escape_string()に食わせた結果得られる値を用いて、クエリを組み立ててみてはいかがでしょうか。
MS Accessのデータだと、おそらく文字コードがSJISだと思いますが、SJISだと文字コード0x40~0x7Eの範囲を取り得ます。この中にはエスケープしなければいけない ' が含まれます。
それ以外にもバイナリデータ(0x00、0x0A、0x0Dなど)もエスケープしなければなりません。
これらが混入していてエスケープせずに、そのままの値でクエリを組み立てると、blob型カラムに入れるとは言え、クエリ不正としてエラーになってしまいます。