« 前の記事
ネコを撮る

データベースに画像を格納する with Perl+DBI+MySQL

2007.3.22(木) 5:16   タグ: Perl, MySQL

画像(をはじめとするバイナリデータ,以下,画像)を管理するようなアプリケーション (というほと大げさではありませんが) を設計するときには,情報 (MIME タイプとかデータサイズとか) のみをデータベース(以下,DB) に格納し,データはファイルとして特定の場所へ保存する,といった方法を,今までとってきました.

この場合,管理するべき場所が 2か所あるわけですが,そんな管理がだんだんと手間に思えてきたので,管理をひとまとめにすべく,画像データを DB に格納する練習をしてみました.

まずは通常どおりの INSERT 文で実行してみます.


use DBI;
$img = <読み込んだ画像データ>;
$dbh = DBI->connect( … ); # MySQL に接続
$sql = qq{INSERT INTO hoge ( id, name, content ) VALUES ( 1, ‘img’, ‘$img’ );};
$sth = $dbh->prepare( $sql );
$sth->execute();

怒られました.

メッセージの内容から,バイナリデータ ($img) の中にシングルクォートに対応するコードが入っているため,SQL 文が不正となってしまう,ということはわかりましたが,しばらくそこから進めませんでした.

で,調べてみたところ,いくつか気になる記事・ページがありました.

これらによると,Perl + DBI な環境では “プレースホルダ (placeholder)” なるものを使うことで解決できるようです.今まで,ほぼ唯一参考にしていた MySQLクイックリファレンス では触れられていなかった (もしくは単なる見落としか) ので,ひとつ勉強になりました.

プレースホルダを使った場合,先のコードは次のように直せます.


use DBI;
$img = <読み込んだ画像データ>;
$dbh = DBI->connect( … ); # MySQL に接続
$sql = qq{INSERT INTO hoge ( id, name, content ) VALUES ( ?, ?, ? );};
$sth = $dbh->prepare( $sql );
$sth->execute( 1, ‘img’, $img );

実行後,無事に格納できました.SELECT 文で問題なく取得することもできました.

画像等の管理の一元化に向けて一歩前進です.

本日の一語: 一元化

(名)スル
ばらばらであった組織や機構を一つの中心体のもとに統一すること。
いちげん-か ―くわ 0 【一元化】 - goo 辞書

そうするべきかそのままにしておくべきか.悩むところです.

この記事へのトラックバック

  1. Perl で、バイナリデータを MySQL に登録する…

    バイナリデータはアスキーコードのシングルクォート「’」を含んでいる可能性があり… (more…)

    トラックバック by Perl Tips — 2007.4.5(木) @ 3:02:06


この記事へのコメント »

この記事へのコメントはまだありません.

コメント RSS

コメントをどうぞ


ぶろぐ内検索

WCAN 2008 Winter

wcan2008winter

DeLLa.JS

細々公開ちゅう

  • DQWindowManager
  • ごよてい?
  • にこぐらふ
  • twitomonitor [ついともにた]
  • issm's ...
  • 今さら攻略 スーパーマリオブラザーズ 2

I'm doing...

Loading...

最近のエントリ

最近のトラックバック

最近のコメント

タグ

月別

あわせて読みたい

あわせて読みたいブログパーツ

数値いくつか

  • issmの泳いだ距離
  • issmの100m個メタイム(秒)
  • issmのBMIとissmの体脂肪率
  • issmの最高血圧とissmの最低血圧

スポンサード リンク

メタ情報