php 反序列化报错及解决

业务逻辑:把从通过程序编辑的一个多维数组,通过序列化为一个字符串,储存到Mysql数据库中。

问题:在编辑完数组后,序列化完毕并保存到数组中,这些都很顺利,问题出在反序列化的时候,

问题提示是:

unserialize-error-at-offset-5-of-9-bytes


尝试1,试了试以前导入进去的数据,反序列化并没有问题。

尝试2,数据库编码与php文件编码不一致,重新设置了php文件编码为utf8,与数据库保持一致,测试,问题没有解决。

尝试3,百度下,有哥们数把数据库保存的类型 由 varchar 改为 text 问题解决了,看了下数据库类型 是longtext类型,没有问题。

尝试4,试着对比以前的数据,发现有一些数据是识别不了的,仔细查了查,原来这些是表情符号,猜想可能是反序列化的时候

解析不了这些表情符号,所以返回的布尔值。然后把数据库字段类型的字符集从utf8改为utf8mb4,再重新编辑数组,序列化数据,

添加数据,反序列化,这次没问题了,解决了。


原因:是因为新增的数据有了表情符号,而数据库的类型是utf8在储存的时候不能解析表情,最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。

三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode字符,

都无法使用 Mysql 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),

和很多不常用的汉字,以及任何新增的 Unicode 字符等等。

这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode,它能够处理Emoji 表情。

从MYSQL5.5开始,才可支持4个字节UTF编码utf8mb4。

猜你喜欢

转载自blog.csdn.net/json_ligege/article/details/77070932