想节约数据库空间,就把大字段的数据用gzcompress压缩了一下,
入库前使用mysql_real_escape_string和get_magic_quotes_gpc处理一下,
但是再读取的时候发现无法解压缩了,请问有什么办法能够解决吗?或者有类似方法能够压缩入库然后读取再解压的?谢谢

解决方案 »

  1.   

    $str = file_get_contents('http://www.sina.com.cn');
    $ystmp = gzcompress($content);
    $ysdata=@ocean_check_input(iconv("GBK", "UTF-8//IGNORE", trim($content)));
      
    $sql_data="INSERT INTO mdata (bid,sid,tid,mdata,udatetime,ugt) VALUES ('".$bid."', '".$sid."', '".$tid."', '".$ysdata."','".$cur."','".time()."' )";
    mysql_query("SET NAMES UTF8");
    $result_data = mysql_query($sql_data,$con);
    if (!$result_data){
    die('Error: ' . mysql_error());
    }其中的ocean_check_input为
    function ocean_check_input($value){
    // 去除斜杠
    if (get_magic_quotes_gpc()){
    $value = stripslashes($value);
    }
    // 如果不是数字则加引号
    if (!is_numeric($value)){
    $value = mysql_real_escape_string($value);
    }
    return $value;
    }
      

  2.   

    展示的时候使用  gzuncompress($row['mdata'])会报错,我刚才把压缩去掉了,现在再复现一下
      

  3.   

    Warning: gzuncompress(): data error in F:\Apache2.2\htdocs\zhdu\ttshow.php on line 28 
      

  4.   

    1、你有
    $str = file_get_contents('http://www.sina.com.cn');
    $ystmp = gzcompress($content);
    被压缩的不知是什么内容2、从
    $ysdata=@ocean_check_input(iconv("GBK", "UTF-8//IGNORE", trim($content)));
    看,同样不知道被处理的是什么内容3、如果是
    $str = file_get_contents('http://www.sina.com.cn');
    $content = gzcompress($str);
    $ysdata=@ocean_check_input(iconv("GBK", "UTF-8//IGNORE", trim($content)));
    那么是处理次序错了,转码必须在压缩前完成
    正确的次序是 转码-》压缩-》转义4、你的 ocean_check_input 函数有问题
    你处理的数据是程序生成的,与 magic_quotes_gpc 开关状态无关
      

  5.   

    正确的次序是 转码-》压缩-》转义谢谢,确实是在压缩后转码这样肯定有问题,不过转义后又出现如下错误
    Error: Incorrect string value: '\x9C\xD5}mS\x1B...' for column 'mdata' at row 1方向对了我再慢慢找原因,哈哈,非常感谢!
      

  6.   

    压缩后就是二进制内容了,如果保存在 text 类型字段中需声明为二进制
      

  7.   

    第一种情况,不压缩,转码->转义后就不出错
    $yszm = iconv("GBK", "UTF-8//IGNORE", trim($content));

    //$ysdata = gzcompress($yszm,9);

    $ysdata= ocean_check_input($yszm);
    第二种情况,压缩,转码->压缩->转义后就出错
    $yszm = iconv("GBK", "UTF-8//IGNORE", trim($content));

    $ystmp = gzcompress($yszm,9);

    $ysdata= ocean_check_input($ystmp);
    Error: Incorrect string value: '\x9C\xD5}mS\x1B...' for column 'mdata' at row 1

    Error: Incorrect string value: '\xDA\xD5}\xFBS\x1B...' for column 'mdata'检查字段字符集utf8,整理utf8_unicode_ci和utf8_general_ci都试了不行您遇到过类似的情况吗?郁闷,查了些资料都不对
      

  8.   

    补充一点资料首先CHAR, VARCHAR, TEXT和BINARY, VARBINARY, BLOB的区别:CHAR, VARCHAR, TEXT称为非二进制字符串;BINARY, VARBINARY, BLOB称为二进制字符串;二进制字符串和非二进制字符串的区别是:
    二进制字符串包含的是字节字符串,非二进制字符串包含的是字符字符串;后者可以定义字符集,前者不可以;而且排序和比较前者基于列值字节的数值值,后者则根据字母顺序进行排序或比较; BINARY类似与CHAR类型,但是保存二进制字符串而不是非二进制字符串;VARBINARY类似与VARCHAR类型,但是保存二进制字符串而不是非二进制字符串;
    同样类似的BLOB对应TEXT类型(相应的有TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB和TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT)