PHP:json_encode vs serialize用于存储在MySQL数据库中?

Dan*_*ola 15 php serialization json

我在我的表的一个字段中存储了一些"非结构化"数据(一个键控数组),我现在正在使用serialize()/ unserialize()从数组到字符串来回"转换".

但是,在反序列化数据时,我偶尔会遇到错误.我相信这些错误的发生是因为我正在序列化的数组中的字符串中的Unicode数据,尽管有一些Unicode数据的记录可以正常工作.(DB字段是UTF-8)

我想知道使用json_encode而不是序列化是否会产生影响/使其更具弹性.这对我来说测试并不简单,因为在我的开发环境中一切都运行良好,但在生产中,偶尔(大约1%的记录)我得到一个错误.

顺便说一句,我知道我正在寻找一个解决这个问题的实际解释而只是盲目地尝试一些东西,我有点希望我可以在不花太多时间的情况下摆脱它.

你认为使用json_encode而不是serialize会使这对"序列化错误"更具弹性吗?数据格式看起来对我来说更"宽容"......

更新:我得到的实际错误是:

 Notice: unserialize(): Error at offset 401 of 569 bytes in C:\blah.php on line 20
Run Code Online (Sandbox Code Playgroud)

谢谢!丹尼尔

Pas*_*TIN 12

JSON有一个主要优势:

  • 与PHP的其他语言兼容.

PHP serialize有一个主要优势:

  • 它专门用于存储基于PHP的数据 - 最值得注意的是,它可以存储序列化对象,类的实例,当字符串被反序列化时,它们将被重新安装到正确的类类型.

(是的,那些优势彼此完全相反)


在您的情况下,当您存储的数据不是真正的结构时,两种格式都应该可以很好地工作.

而你所遇到的编码问题本身并不应该与序列化有关:只要所有内容(数据库,与数据库的连接,PHP文件......)都是UTF-8,序列化也应该有效.


Dan*_*ola 1

在 PHP 文档中找到了这个...

function mb_unserialize($serial_str) { 
    $out = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str ); 
    return unserialize($out); 
} 
Run Code Online (Sandbox Code Playgroud)

我不太明白它,但它可以反序列化我以前无法反序列化的数据。现在转移到 JSON,我将在几周内报告这是否解决了随机使某些记录“损坏”的问题