
ローカルに保存してあるファイルを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;
上記のようなコードなのですが、おかしな点があれば教えてください。
よろしくおねがいします。
No.2ベストアンサー
- 回答日時:
>カラム属性のようなもの
そうです。
すみません、「BN」ではなく、「BIN」でした。失礼しました。
DBの管理ツールとして「MySQL Workbench」などを使用しているとわかりやすいと思いますが、
「BIN」の他にも「PK」=プライマリキー、「NN」=not nullなどのチェックがあり、そういった設定項目の一つです。

この回答への補足
今手元に環境がないため、
vmwareで環境を作りMySQLに同じスクリプトからデータを突っ込んでみたのですがデータが壊れるということがありませんでした。
default-character-setとかそのあたり現象が発生した環境とは違いがあるのかもしれませんが、今環境がみれないのでそのあたりの違いはわかりません。
ただ気になったのが今作成した環境では日本語ファイル名でも文字化けは起こらず格納されたのですが問題の環境では日本語ファイルだと文字化けして保存されていたことです。
問題の環境は文字コードの設定に問題があるのかもしれません。
回答ありがとうございます。
BIN=BINARYということですね。ありがとうございます。
WorkBenchを使用してないので普通のMySQLコマンドからではどう表示されるかわかりませんが、BLOB型を指定していたら自動でBINARYつくわけじゃないんですね。
調べていたところ、どうもBLOB型がわるかったらしく(64KBしか格納できない)画像はOKでxlsやpdfがファイル壊れていたのはファイルサイズの問題のようでした。バイナリデータが途中で切られているみたいです。
まだ実際に確認できてはいないのですがもっと大きい型にすればファイル壊れないですむのかな?と思っています。
お手数おかけしました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
WindowsでPerlをする際,1行目の...
-
fortranのファイル入出力のopen文
-
fopen64について
-
batファイルでrenameができませ...
-
パイプをopenして/usr/bin/grep...
-
Windowsで複数のファイルを同じ...
-
awkスクリプトでダブルクォーテ...
-
Perlで特定行から特定行までを...
-
unlink 、renameが使えない理由
-
openした後、closeしないでプロ...
-
dos変数の%~dp0は powershellで...
-
パスから最後のディレクトリだ...
-
cgiで表示するhtmlページ内でバ...
-
C言語で特定の行を抽出する方法...
-
一定時間が経過したフォルダの削除
-
C#でCSVファイルを逐一更新したい
-
close()で例外が投げられる理由
-
エラーログ「\\x8ew\\x92\\xe8...
-
perlで大容量CSVのsort方法につ...
-
ExcelをCSV書き出す場合のシー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgets で値が取得できない
-
drtファイルはどうしたら開...
-
MATLABのm-fileについて
-
ファイル全てを .xlsm に変更し...
-
window.open でのファイル指定方法
-
シェルスクリプトによる計算
-
どこがおかしいのか教えてくだ...
-
文字列の抽出がうまくできません
-
ファイルの読み込みと置き換え
-
VBAコードを張り付け後のエクセ...
-
PHPコードをはじめ、記号や記述...
-
python renameについて
-
巨大なテキストの最終行を取得...
-
perlのDigest::MD5;でのMD5算出...
-
WindowsでPerlをする際,1行目の...
-
正規表現で " ← を削除する...
-
正規表現の一致について
-
powerpointでwebページとして保...
-
VBA テキストファイルを読み取...
-
データフォルダ参照先
おすすめ情報