我有一个 sqlite 数据库,我想从中提取一列数据类型为 BLOB 的信息。我正在尝试这个:
SELECT cast(data as TEXT) FROM content
这显然是行不通的。输出是这样的乱码:
x��Uak�0�>�8�0Ff;I�.��.i%�A��s�M
内容列中的数据主要是文本,但也可能有图像(我认为如果我转换为 TEXT 可能会导致问题)。我只是想将这些数据提取成可用的格式。有任何想法吗?
您可以使用
SELECT hex(data) FROM content
或者
SELECT quote(data) FROM content
第一个将返回一个十六进制字符串 ( ABCD
),第二个引用为 SQL 文字 ( X'ABCD'
)。
请注意,(目前)没有办法将十六进制列信息转换回 SQLite 中的 BLOB。您将不得不使用 C/Perl/Python/... 绑定来转换和导入它们。
您可以编写一些简单的脚本,将数据库中的所有 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();