Sqlite:如何为BLOB强制转换(数据为TEXT)

时间:2013-01-21 08:45:34

标签: sqlite casting

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

SELECT cast(data as TEXT) FROM content

这显然不起作用。输出是乱码文本,如下所示:

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

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

2 个答案:

答案 0 :(得分:26)

您可以使用

SELECT hex(data) FROM content

SELECT quote(data) FROM content

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

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

答案 1 :(得分:1)

您可以编写一些简单的脚本,将数据库中的所有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();