![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
ローカルに保存してあるファイルを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などのチェックがあり、そういった設定項目の一つです。
![「MySQLにバイナリデータを正常に保存で」の回答画像2](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/a/19835591_5497e8d2e5f9d/M.jpg)
この回答への補足
今手元に環境がないため、
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ランキング
-
window.open でのファイル指定方法
-
fgets で値が取得できない
-
MATLABのm-fileについて
-
WindowsでPerlをする際,1行目の...
-
ファイル全てを .xlsm に変更し...
-
ファイルの存在の有無を確かめ...
-
巨大なテキストの最終行を取得...
-
fortranのopen文について。
-
行を指定して削除する方法PERL
-
JSP URLに表示される拡張子 .jsp
-
PerlでHTTPを扱いたい
-
VBAでCSVファイルの特定行を書...
-
ReadLineでの読み出し行を指定する
-
awkスクリプトでダブルクォーテ...
-
VBAで巨大なファイルの途中から...
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルを途中行まで...
-
htaccessで特定のディレクトリ...
-
fopenでディレクトリ内の全ファ...
-
ファイル出力の改行コードをLFに
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python renameについて
-
fgets で値が取得できない
-
window.open でのファイル指定方法
-
巨大なテキストの最終行を取得...
-
ファイル全てを .xlsm に変更し...
-
read() on unopened filehandle...
-
csvファイルの横方向への改行に...
-
VBAコードを張り付け後のエクセ...
-
Firefox で file:// で始まる U...
-
JSP URLに表示される拡張子 .jsp
-
drtファイルはどうしたら開...
-
並び方、
-
重複ファイル名ある場合ファイ...
-
VBA テキストファイルを読み取...
-
cgiでサーバーにファイルを追加...
-
HTMLのフォームで画像と文...
-
WindowsでPerlをする際,1行目の...
-
バイナリファイルの出力
-
Perlでのパーミッション変更の仕方
-
foreach内での変数の扱い?
おすすめ情報