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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章