Извлечь двоичные данные из БД в файл

0

Как извлечь двоичные данные из базы данных в файл

CREATE TABLE `mail_attachs` (
  `attachid` int(15) NOT NULL auto_increment,
  `filecontent` longtext,
  PRIMARY KEY  (`attachid`),
) ENGINE=MyISAM 

Двоичные данные были сохранены в столбце filecontent. Я хочу извлечь файлы и текст, сохраненные в этом столбце, и сохранить их в файл на том же сервере. Имя файла будет содержать приложение, чтобы я мог идентифицировать и связывать запись, найденную в БД.

Теги:

2 ответа

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 ? 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
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']);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню