php gzuncompress data error问题解决
来源:互联网 发布:哈尔滨黑夜骑士网络 编辑:程序博客网 时间:2024/05/17 00:15
最近一个项目里使用mysql数据库,维护单位要求字段平均长度必须小于1k,由于存的东西太多,有的达到了14k,所以必须要压缩
pack() format characters Code Description aNUL-padded stringASPACE-padded string无解,看中文解释https://segmentfault.com/a/1190000008305573
开始想的是对内容gzcompress后base64,但这会增加1/3的数据量,考虑到维护单位的变态要求,考虑对内容gzcompress后转成二进制流后直接存成varbinary,这样保存数据就不用考虑编码的问题了。
php转成二进制流使用的就是pack和unpack,使用如下:
/** * 将字符串压缩并转成二进制流 * @param $string * @return string */ public static function gzCompressAndToBinary($string) { $cmpr = gzcompress($string); return pack('A*', $cmpr); }
/** * 将二进制流解压成字符串 * 与gzCompressAndToBinary操作相反 * @param $bytes * @return mixed */ public static function gzUncompressFromBinary($bytes) { $unpacks = unpack('A*', $bytes); $gzcomp = ''; foreach ($unpacks as $k => $v) { if (!empty($v)) { $gzcomp = $v; break; // 测试发现值对应的索引是1,而不是0 } } return gzuncompress($gzcomp); }
但后来发现gzuncompress会报错“gzuncompress(): data error”
在网上找了各种资料都没有正解,其中有一个人问了存在myISAM模式下没有问题,但保存在innodb模式下会出现解压失败的情况
没有仔细去研究myISAM和innodb的区别,但可以推测是在数据保存过程或数据取出过程中发生了微妙的变化,所以怀疑是在二进制转换时发生的变化,因为压缩和解压缩没有参数影响结果,而pack和unpack时有一个格式字符
查询php说明
Code Description
$string = pack('a6', 'china');var_dump($string); //输出结果: string(6) "china",最后一个字节是不可见的NULecho ord($string[5]); //输出结果: 0(ASCII码中0对应的就是nul)//A同理$string = pack('A6', 'china');var_dump($string); //输出结果: string(6) "china ",最后一个字节是空格echo ord($string[5]); //输出结果: 32(ASCII码中32对应的就是空格)
尝试一下使用unpack('a*', $string);来解二进制流,发现可以解之前不能解出来的信息然后把生成和解二进制流的format都换成'a*',问题解决。
阅读全文
0 0
- php gzuncompress data error问题解决
- PHP gzcompress 压缩,java实现gzuncompress
- php程序中调用gzuncompress失败的解决办法
- PHP 中 gzuncompress 在 服务器上受限的处理
- 【问题解决】PHP 'Internal Server Error,500 error'
- php-curl ErrnoProblem (2) in the Chunked-Encoded data问题解决
- loadrunner执行场景时报Error -27040: Data Format Extension: Init: Internal error问题解决
- loadrunner执行场景时报Error -27040: Data Format Extension: Init: Internal error问题解决
- Error问题解决
- Parse error: syntax error, unexpected T_STRING in \\e\\data\\tmp\\templist2.php on line 159
- PHP问题解决
- PHP问题解决
- Error establishing socket 问题解决
- "symbol lookup error"问题解决
- SOAP_FD_EXCEEDED error code 问题解决
- dwr session error 问题解决
- SQUASHFS error问题解决
- [问题解决]Error: ShouldNotReachHere() [整理]
- sso单点登录
- C#语言-输入三角形或者长方形边长,计算其周长和面积并输出
- 生活小记22
- 输入一个链表,从尾到头打印链表每个节点的值
- 事件
- php gzuncompress data error问题解决
- target属性的值
- codeforces 402D D. Upgrading Array
- Java中List.remove报错UnsupportedOperationException
- Java算法之动态规划基本思想以及具体案例
- POJ 3155 Hard Life 最大密度子图
- 【第五周项目5】后缀表达式
- 第五周项目3-括号的匹配问题
- 解决blur与click冲突