19

我有一个 sqlite 数据库,我想从中提取一列数据类型为 BLOB 的信息。我正在尝试这个:

SELECT cast(data as TEXT) FROM content

这显然是行不通的。输出是这样的乱码:

x��Uak�0�>�8�0Ff;I�.��.i׮%�A��s�M

内容列中的数据主要是文本,但也可能有图像(我认为如果我转换为 TEXT 可能会导致问题)。我只是想将这些数据提取成可用的格式。有任何想法吗?

4

2 回答 2

33

您可以使用

SELECT hex(data) FROM content

或者

SELECT quote(data) FROM content

第一个将返回一个十六进制字符串 ( ABCD),第二个引用为 SQL 文字 ( X'ABCD')。

请注意,(目前)没有办法将十六进制列信息转换回 SQLite 中的 BLOB。您将不得不使用 C/Perl/Python/... 绑定来转换和导入它们。

于 2013-08-23T11:00:51.157 回答
2

您可以编写一些简单的脚本,将数据库中的所有 blob 保存到文件中。稍后,您可以查看这些文件并决定如何处理它们。

例如,此 Perl 脚本将在当前目录中创建大量文件,这些文件将包含您的数据 blob 字段。只需调整 SELECT 语句以根据需要限制获取的行:

use DBI;

my $dbh = DBI->connect("dbi:SQLite:mysqlite.db")
    or die DBI::errstr();
my $sth = $dbh->prepare(qq{
    SELECT id, data FROM content
});
$sth->execute();
while (my $row = $sth->fetchrow_hashref()) {
    # Create file with name of $row->{id}:
    open FILE, ">", "$row->{id}";
    # Save blob data into this file:
    print FILE $row->{data};
    close FILE;
}
$dbh->disconnect();
于 2013-01-21T09:05:44.473 回答