
ローカルに保存してあるファイルを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で質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP PHP MySQLに画像を直接保存 2 2022/06/05 11:50
- その他(プログラミング・Web制作) Pythonを勉強しています。 5 2023/08/25 09:51
- その他(プログラミング・Web制作) python flask から fastapiへの移行時のエラー対処 1 2023/02/05 12:26
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- その他(プログラミング・Web制作) mariadbでのエラー 1 2022/11/15 12:31
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- Visual Basic(VBA) vbaの構文の修正相談(xmlファイルを順に開いてコピペ作業) 1 2023/04/22 01:18
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgets で値が取得できない
-
無料配布の郵便番号自動入力cgi...
-
VBScriptにて、テキストファイ...
-
Perlで特定行から特定行までを...
-
readdir()で得られるファイル・...
-
VBを使ってのCD-RWへのバックア...
-
openした後、closeしないでプロ...
-
perlのflock関数でロックをかけ...
-
Perlで特定文字列から特定文字...
-
Windowsで複数のファイルを同じ...
-
Edge スクレイピング
-
batファイルでrenameができませ...
-
where can I buy snowbord in t...
-
連番のファイルを何個も開きたい
-
エクセルVBA コードが同じでも...
-
ファイル名を複数個配列で確保...
-
空白文字 \\f と\\v の違いに...
-
vba dir の相対パス
-
makefileでファイルをコピー(...
-
配列の中に重複文字列があるか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
window.open でのファイル指定方法
-
python renameについて
-
fgets で値が取得できない
-
行を指定して削除する方法PERL
-
csvファイルの横方向への改行に...
-
drtファイルはどうしたら開...
-
MATLABのm-fileについて
-
JSP URLに表示される拡張子 .jsp
-
オブジェクト作成の順番
-
WindowsでPerlをする際,1行目の...
-
ファイル検索の条件について
-
Perl の「stringify」の意味に...
-
perl ファイルが開かない
-
Javaのフォームの入力欄に文字...
-
一つのテキストファイルと複数...
-
MP3情報の表示
-
PerlでのUseless use...
-
巨大なテキストの最終行を取得...
-
ファイル全てを .xlsm に変更し...
-
MySQLにバイナリデータを正常に...
おすすめ情報