[PHP-users 7711] Re: PostgreSQLテーブルに画像を出し入れしたい。

Yasuo Ohgaki php-users@php.gr.jp
Tue, 28 May 2002 22:19:57 +0900


大垣です。

AriAri wrote:
> こんばんはAriAriです。いつもお世話になります。
> Postgresqlに画像データ等がしまえることを最近知り、いろいろ調べましたところ過
> 去ログにインサートスクリプトがありました。
> $fp = fopen('php.gif','r');
> $image = fread($fp, filesize('php.gif'));
> $escaped = pg_escape_bytea($image);
> $sql = "INSERT INTO test(bin) VALUES ('".$escaped."');"
> 上記でphp.gif画像がしまえると思いますが、これをどの様にして、取り出したらよ
> いのでしょうか?

たぶん、このスクリプトは私がJPUGのMLに問題をレポートした時に
書いたものですね。

結論から言うとbyteaの利用はお勧めしません。
byteaを利用するにはselectした後、unescapeしなければなりま
せんがbyteaのunescape関数はPostgreSQL 7.3のlibpqから付
いてきます。それまで利用される事はお勧めしません。

# PostgreSQL 7.3がリリースされたら、pg_unescape_bytea()
# を追加します。

どうしても、という場合はPostgreSQLのマニュアルに書いてある
仕様通りにunescapeする関数を作る必要があります。

byteaを利用する場合、キャストしないとエラーが発生する場合が
あります。これはバイナリを文字列として取り扱い、不正なバイト
シークエンスがあると勘違いする為です。

> また、fopenしている画像のパスなんかも絶対パスで指定できるのでしょうか?

セーフモードを利用していなければ利用できるはずです。

> 
> VineLinux2.1.5(apache1.3.23)+php 4.2.1+PostgreSQL 7.2
> 上記環境です。よろしくお願いいたします。

せっかくbytea型がサポートされているので利用したいところ
ですが、large objectに比べて何十倍も遅くなる場合があります。
たぶん、エスケープ/アンエスケープ処理とエンコーディングチェッ
クが有効になってしまっている為と思います。

# 本当のところは知りませんが、7.2のbyteaはとにかく遅い
# 様です。

large objectを利用するか場所(URI、パス)だけをPostgreSQL
に記録する方法をお勧めします。

ついでに、最近直したPostgreSQLモジュールの不具合も書いてお
きます。large object関数のpg_lo_read(), pg_lo_read_all()
はかなり遅くなるようにコーディングされていました。この前修正した
ので、pg_lo_read(), pg_lo_read_all()は速くなったと思います。
特に、Output Bufferを利用している場合、大きな差がでると思います。

気になる方は、PHP 4.3.0-devのPostgreSQLモジュールを使って
見てください。4.2.xで利用する場合、config.m4のみ4.2.0の
ファイルを利用するとビルドできるはずです。

--
Yasuo Ohgaki










__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!  http://bb.yahoo.co.jp/