我在SQLite数据库中有一张表,存储着使用LZ4算法压缩的二进制大对象。我尝试使用Compress::LZ4中的解压/解压缩函数,但没有成功。
可以从这里下载示例SQLite数据库。
以下是我连接到SQLite数据库并获取二进制大对象的方法:
但是解压函数只返回未定义值。解压后的数据应该类似于(以下输出由XML转换器生成):
可以从这里下载示例SQLite数据库。
以下是我连接到SQLite数据库并获取二进制大对象的方法:
use DBI;
use Data::Dump;
use MIME::Base64;
use Compress::LZ4;
my $dbh = DBI->connect("dbi:SQLite:dbname=$ARGV[0]","","");
$sth = $dbh->prepare("select blob_data from blob_parts where data_fk = 6");
$sth->execute();
$result = $sth->fetch;
$blob = $result->[0];
dd $blob;
dd (decompress($blob));
$sth->finish();
$dbh->disconnect;
对于此示例代码中所选择的特定 blob(data_fk=6),dd 输出以下内容:
"LZ4\1>\1\0\0\xF7\xD6df\xF1mBXML\1\xA1\a版本\xA1\4类型\xA1\2标识符\xA1\3引用\xA1\4大小\xA1\3使用\xA1\4表达式\xA1\5值\xA1\4数据\xA1/序列化\xA1\aPoints3\xA1\t用户_E\0\xF0\16\b顶点\xA1\6双精度\xA1\b有属性\xA1\16\n\0\xC7对象ID\xA1\n\f\0\xF1M\4项\xA1\t是否活跃\xA0~B\20\n\22\6\4\x8C\1\0\0\0\6\2\xAA\24\6\0\xA4\x82\x88\2\x80\x82\x82\xA6B\26\6\b\x80\1B\30\6\b\x88\2\3B\32\1\x93\6\0\0\0`\xACu\xCF\xBF\0\0\0\0\xCC\xF8\xC2?\0\0\0\0\0\x004\@\0\0\0 \xAA\xEF\xA9\20\x001h\xC5\xB1\b\0\xD0\0\0\$\@\1B\34\x85B\36\x87B C\0\xF0\aB\"\6\0\x88\3B\$\x85\1B\"\6\0\x88\3B\ $\x85\1\1\1"但是解压函数只返回未定义值。解压后的数据应该类似于(以下输出由XML转换器生成):
<?xml version="1.0" encoding="utf-8"?>
<MultiStreamDocument>
<!-- Stream 1 -->
<?xml version="1.0" encoding="utf-8"?>
<data xmlns="" Id="1" Type="Points3" Version="1 2 0 1 1">
<user_data Size="0"></user_data>
<vertices Size="2">
<double>-0.24577860534191132</double>
<double>0.14821767807006836</double>
<double>20</double>
<double>0.050656620413064957</double>
<double>0.069418430328369141</double>
<double>10</double>
</vertices>
<has_attr>false</has_attr>
<has_object_ids>true</has_object_ids>
<object_ids Size="2">
<item Version="3">
<is_active>false</is_active>
</item>
<item Version="3">
<is_active>false</is_active>
</item>
</object_ids>
</data><!-- Stream size: 126 bytes -->
</MultiStreamDocument>
如何从此SQLite数据库中正确获取未压缩的blob数据?