【问题标题】:How to implement mysql compress() function in php如何在php中实现mysql的compress()函数
【发布时间】:2010-02-01 13:51:06
【问题描述】:

我想压缩 TEXT 以存储在 MySQL 中。所以我会在 php 中执行 gzcompress() 然后发送到 mysql,但我也在设置 Sphinx 全文搜索,如果它可以用一个简单的查询来填充它的索引,那就太好了。

select uncompress(thing) from table

但是我还是想在php而不是mysql中对应用程序进行压缩和解压,并且只使用mysql uncompress()函数进行sphinx索引。

mysql 文档对它的压缩功能有如下说明:

非空字符串存储为 未压缩的四字节长度 字符串(低字节在前),然后是 压缩后的字符串。

所以我的问题是……如何构造这个四字节长度的未压缩字符串?之后,压缩后的 BLOB 看起来就像 php gzcompress() 函数的结果。

【问题讨论】:

    标签: php mysql compression sphinx


    【解决方案1】:

    从来没有这样做过,但这里有一些想法:

    1) 找到未压缩字符串的长度... strlen() 函数应该可以工作

    2) 压缩字符串...你已经完成了这部分

    3) 将两者打包在一起存储在 mysql 中,按照 mysql 的需要格式化数字:

    php 的pack function:听起来你需要使用格式值“V”作为长度(无符号长... 32 位,小端字节序)

    【讨论】:

    【解决方案2】:

    这是我针对该场景的代码,对于解压缩,您还可以使用 PHP 并调整前 4 个字节的 substr。
    mysql的输出:

    mysql : "select hex(compress('1234512345'))"
    0A000000789C3334323631350411000AEB01FF
    

    php 等价物:

    $string="1234512345";
    $data=gzcompress($string);
    $len=mb_strlen($string);
    $head=pack('V',$len);
    
    echo($head);
    echo($data);
    

    PHP 的输出:

    php test.php  | hexdump -C
    00000000  0a 00 00 00 78 9c 33 34  32 36 31 35 04 11 00 0a
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2018-09-03
      • 2023-03-11
      • 2011-08-19
      相关资源
      最近更新 更多