Home > Backend Development > PHP Tutorial > php json_encode 之后gzdeflate然后插入mysql数据库,插入失败

php json_encode 之后gzdeflate然后插入mysql数据库,插入失败

WBOY
Release: 2016-06-06 20:40:01
Original
1420 people have browsed it

$a = array('aa'=>'bb');
$s = json_encode($a);
$s = gzdeflate($s);//前面提问题的时候居然把这一句漏掉了,大大的失误(2014/12/22 18:20:00补充)
$sql = "insert into tbl_name(id,content) values(1,'%s')";
$sql = sprintf($sql,$s);
mysql_connect('host','user','pwd');
mysql_query('set names utf8');
mysql_query('use db_name');
mysql_query($sql);
mysql_close();

上面的代码执行之后数据库里面有新增的记录,但是content字段的值是空的,请大侠指点一下,我的问题在哪里?

补充
我把sql打印出来了:insert into tbl_name(id,content) values(1,'KLÜ0\0')
结果数据库里面是下面的内容:
php json_encode 之后gzdeflate然后插入mysql数据库,插入失败
感觉像是字符集不支持,已经检查了database和table都是utf8?

然后,还有就是我在取数据的时候要注意哪些问题?

回复内容:

$a = array('aa'=>'bb');
$s = json_encode($a);
$s = gzdeflate($s);//前面提问题的时候居然把这一句漏掉了,大大的失误(2014/12/22 18:20:00补充)
$sql = "insert into tbl_name(id,content) values(1,'%s')";
$sql = sprintf($sql,$s);
mysql_connect('host','user','pwd');
mysql_query('set names utf8');
mysql_query('use db_name');
mysql_query($sql);
mysql_close();

上面的代码执行之后数据库里面有新增的记录,但是content字段的值是空的,请大侠指点一下,我的问题在哪里?

补充
我把sql打印出来了:insert into tbl_name(id,content) values(1,'KLÜ0\0')
结果数据库里面是下面的内容:
php json_encode 之后gzdeflate然后插入mysql数据库,插入失败
感觉像是字符集不支持,已经检查了database和table都是utf8?

然后,还有就是我在取数据的时候要注意哪些问题?

这个不是字符集的问题,而是编码的问题
gzdeflate之后的数据是二进制串,不属于任何字符集,字符集是针对可打印(printable)文本串

你这样utf8_encode其实是把gzdeflate之后的二进制串当做iso_8859_1编码的字符串转换为utf-8编码,这样一步操作只会让压缩后的二进制串长度增加(所有ASCII>127的字符都会被扩充到2个字节以上)

如果出于压缩考虑,最好直接使用BLOB等二进制类型存储,存取的时候也不需要进行编码转换

问题解决了,确实是字符集的问题,把gzdeflate压缩后的数据进行utf8_encode一下就可以了

$a = array('aa'=>'bb');
$s = json_encode($a);
$s = gzdeflate($s);
$s = utf8_encode($s);//答案就在这里,取出来的时候相应的做一下utf_decode()
$sql = "insert into tbl_name(id,content) values(1,'%s')";
$sql = sprintf($sql,$s);
mysql_connect('host','user','pwd');
mysql_query('set names utf8');
mysql_query('use db_name');
mysql_query($sql);
mysql_close();

参考了这里的信息http://stackoverflow.com/questions/9413402/php-mysql-special-character-inserts-being-truncated

对比了一下gzdeflate数据前面的大小,原来28万个字节的内容压缩之后只有2000多,压缩比率相当高

也可以吧gzdeflate后的数据再base64下来增强兼容性,或者数据库中直接存储deflate后的二进制流

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template