電子書籍の厳選無料作品が豊富!

ローカルに保存してあるファイルをMySQLにバイナリデータとして格納して保存したいと思ってます。
データは格納できるのですが、文字エンコード?の問題でファイルが壊れてしまっているみたいです。
格納後、出力した際にjpgなどの画像は問題なく表示されるのですが、xlsやpdfなどのファイルが開けなくなります。MySQLの文字コードはUTF8です。

#!/usr/bin/perl
use DBI;

my $dbh = DBI->connect('DBI:mysql:database:localhost:3306', 'user', 'password');

# ファイルパス
my $file = '/tmp/test.xls';
# ファイルサイズ
my $size = -s $file;

# バイナリデータ読み込み
my $line;
open(IN, $file);
binmode(IN);
sysread(IN, $line, $size);
close(IN);

# DBに格納
my $sth = $dbh->prepare(qq|INSERT INTO file_table ( `file_name`, `file_data` ) VALUES (?, ?)|);
$sth->execute('test.xls', $line);

$dbh->disconnect;

上記のようなコードなのですが、おかしな点があれば教えてください。
よろしくおねがいします。

A 回答 (2件)

>カラム属性のようなもの


そうです。
すみません、「BN」ではなく、「BIN」でした。失礼しました。
DBの管理ツールとして「MySQL Workbench」などを使用しているとわかりやすいと思いますが、
「BIN」の他にも「PK」=プライマリキー、「NN」=not nullなどのチェックがあり、そういった設定項目の一つです。
「MySQLにバイナリデータを正常に保存で」の回答画像2

この回答への補足

今手元に環境がないため、
vmwareで環境を作りMySQLに同じスクリプトからデータを突っ込んでみたのですがデータが壊れるということがありませんでした。

default-character-setとかそのあたり現象が発生した環境とは違いがあるのかもしれませんが、今環境がみれないのでそのあたりの違いはわかりません。

ただ気になったのが今作成した環境では日本語ファイル名でも文字化けは起こらず格納されたのですが問題の環境では日本語ファイルだと文字化けして保存されていたことです。

問題の環境は文字コードの設定に問題があるのかもしれません。

補足日時:2011/05/21 20:48
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

BIN=BINARYということですね。ありがとうございます。
WorkBenchを使用してないので普通のMySQLコマンドからではどう表示されるかわかりませんが、BLOB型を指定していたら自動でBINARYつくわけじゃないんですね。

調べていたところ、どうもBLOB型がわるかったらしく(64KBしか格納できない)画像はOKでxlsやpdfがファイル壊れていたのはファイルサイズの問題のようでした。バイナリデータが途中で切られているみたいです。
まだ実際に確認できてはいないのですがもっと大きい型にすればファイル壊れないですむのかな?と思っています。

お手数おかけしました。

お礼日時:2011/05/21 12:09

コードの問題ではなくて、カラムの設定の問題だと思います。


「BN」にチェックをつければバイナリデータを正常に保存できたはずです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

MySQLのカラムを記載していませんでした。申し訳ありません。
バイナリデータを格納するfile_dataはBLOB型でカラムを作成しています。

BNがよくわからないのですが、カラム属性かなにかでしょうか。

お礼日時:2011/05/21 02:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!