如何使用zlib.h在m MYSQL_RES中解压缩COMPRESSED BLOB而不在mysql查询中使用UNCOMPRESS

时间:2014-11-04 14:04:31

标签: c++ mysql c compression zlib

我使用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)
}

2 个答案:

答案 0 :(得分:0)

我不知道你是否正确地做了,我无法理解你想要的东西。

基本上BLOB用于存储图像,视频等二进制数据

所以你逐字节地存储它们并检索它们。

此外,您还希望压缩。

因此,压缩字节并存储。检索时解压缩它。

示例示例:

select uncompress(compress('hello world')) as sample;

enter image description here

本教程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 - 似乎都没有成功解决问题。