我使用insert compress {hex data}将数据存储到innodb表BLOB列中。我需要使用mysql c api以编程方式选择压缩数据,并在应用程序级别解压缩它。我可以使用zlib.h和uncompress函数或inflate / deflate方法吗?
我不能在mysql查询中使用uncompress,因为它是一个大的resuult集,并且数据通过网络传输到另一台服务器上。
例如:
MYSQL_RES *results = NULL;
MYSQL_ROW row;
results = exec_query();
while ( row = mysql_fetch_row(results) )
{
// row[0] = uncompressed size
// row[1] = compressed size
// row[2] = compressed blob
// does MYSQL "INSERT COMPRESS( {data} ) INTO ... " use LZ77?
// will this work?
// uncompress ( Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)
}
答案 0 :(得分:0)
我不知道你是否正确地做了,我无法理解你想要的东西。
基本上BLOB用于存储图像,视频等二进制数据
所以你逐字节地存储它们并检索它们。
此外,您还希望压缩。
因此,压缩字节并存储。检索时解压缩它。
示例示例:
select uncompress(compress('hello world')) as sample;
本教程here展示了如何使用MySQL C API将图像插入MySQL数据库。
答案 1 :(得分:0)
在 Perl https://metacpan.org/pod/MySQL::Compress 中有一个使用 zlib 的尝试,它似乎只是从 mysql 压缩字符串中去除前 4 个字节(长度信息)。像这样在 Python zlib 中使用这种方法:
b=bytearray(mysql_compressed_data)
for i in range(4):
del b[0]
mysql_compressed_data=bytes(b)
zlib.decompress( mysql_compressed_data , -15)
,然而,产生
zlib.error: Error -3 while decompressing data: invalid stored block lengths
可以在此处找到我见过的其他尝试:python-2-x-zlib-decompress-data-from-mysql 和此处:mysql-compress-vs-php-gzcompress - 似乎都没有成功解决问题。