我想压缩TEXT以存储在MySQL中。 所以我只是在php中做gzcompress()然后发送到mysql,但是我也在设置Sphinx全文搜索,如果它可以用一个简单的查询来填充其索引,那就很好了。
select uncompress(thing) from table
但是我仍然想为php中的应用程序而不是mysql进行压缩和解压缩,并且仅将mysql uncompress()函数用于sphinx索引。
mysql文档对压缩功能的说明如下:
Nonempty strings are stored as a
four-byte length of the uncompressed
string (low byte first), followed by
the compressed string.
所以我的问题是...如何构造未压缩字符串的这四个字节的长度? 之后,压缩后的BLOB看起来就像php gzcompress()函数的结果。
从来没有做过,但是这里有一些想法:
1)找到未压缩字符串的长度... strlen()函数应该起作用
2)压缩字符串...您已经完成了这一部分
3)将两者打包在一起以存储在mysql中,按照mysql的要求格式化数字:
php的pack函数:听起来您需要使用格式值" V"作为长度(无符号长... 32位,小尾数字节顺序)
谢谢。 这是我不知道的打包功能。
除了上述正确答案外,请考虑将mb_strlen用于压缩长度。 这样可以避免出现奇数字符的问题。 php.net/manual/en/function.mb-strlen.php
这是我针对这种情况的代码,对于解压缩,您还可以使用PHP并在开始的4个字节之外进行调整。
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