业务逻辑:把从通过程序编辑的一个多维数组,通过序列化为一个字符串,储存到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。