如何从数据库中提取二进制数据到文件
CREATE TABLE `mail_attachs` (
`attachid` int(15) NOT NULL auto_increment,
`filecontent` longtext,
PRIMARY KEY (`attachid`),
) ENGINE=MyISAM
二进制数据已保存在 filecontent 列中。我想提取保存在此列中的文件和文本,并将其保存到同一服务器上的文件中。 文件名将包含attachid,以便我可以识别和关联在DB中找到的记录。
答案 0 :(得分:1)
你也用'perl'标记了这个,所以这是一个perl解决方案。 “BETWEEN”子句是一种只能一次处理如此多数据的简单方法,因为selectall_arrayref调用将(在当前版本的DBI模块下)将您要求的所有数据加载到内存中。
mysql> insert into mail_attachs values ( 1, 'abc' ), ( 2, 'def' );
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
$ cat extract.pl
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
my $output_dir = '/home/jmccarthy/mail_attachs';
my $dbh = DBI->connect_cached("DBI:mysql:database=test;host=dbmachine",
'username', 'password');
die "cannot connect, $DBI::err" if ! $dbh;
my $rows = $dbh->selectall_arrayref("SELECT attachid, filecontent FROM mail_attachs
WHERE attachid BETWEEN ? AND ?",
{ Slice => {} }, # get back better-self-documenting hashrefs, instead of arrayrefs
1, 1000); # values for the ?'s above
die "selectall_arrayref failed, $DBI::err" if $DBI::err;
for my $row (@$rows) {
open my $fh, '>', "$output_dir/file$row->{attachid}"
or die "cannot write $row->{attachid}, $!";
print $fh $row->{filecontent}
or die "cannot print to $row->{attachid}, $!";
close $fh
or die "cannot close $row->{attachid}, $!";
print "wrote $row->{attachid}\n";
}
$ ./extract.pl
wrote 1
wrote 2
$ head mail_attachs/file*
==> mail_attachs/file1 <==
abc
==> mail_attachs/file2 <==
def
答案 1 :(得分:0)
只需使用mysql_query
,mysql_fetch_assoc
从数据库中读取并使用file_put_contents
存储到文件
$result = mysql_query("select attachid, filecontent from mail_attachs");
while($row = mysql_fetch_assoc($result))
file_put_contents($row['attachid'], $row['filecontent']);