PHP:json_encode与序列化存储在MySQL数据库中?

2022-08-30 23:30:36

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

但是,在取消序列化数据时,我时不时会遇到错误。我相信这些错误是由于我正在序列化的数组内的字符串中的Unicode数据而发生的,尽管有些带有Unicode数据的记录工作正常。(数据库字段为 UTF-8)

我想知道使用json_encode而不是序列化是否会有所作为/使其更具弹性。这对我来说不是微不足道的测试,因为在我的开发环境中,一切都运行良好,但在生产中,时不时地(大约1%的记录)我会收到一个错误。

顺便说一句,我知道我正在为这个问题找到一个实际的解释,只是盲目地尝试一些东西,我有点希望我能摆脱它,而不必花太多时间在上面。

您是否认为使用json_encode而不是序列化会使它更能适应“序列化错误”?数据格式对我来说看起来更“宽容”...

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

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

谢谢!丹尼尔


答案 1

JSON有一个主要优点:

  • 与 PHP 以外的其他语言兼容。

PHP的序列化有一个主要优点:

  • 它专门设计用于存储基于PHP的数据 - 最值得注意的是,它可以存储序列化的对象,类的实例,当字符串未序列化时,这些对象将重新实例化为正确的类类型。

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


在你的情况下,当你存储的数据不是真正结构化的,这两种格式应该都能很好地工作。

您遇到的编码问题不应该与序列化本身有关:只要所有内容(DB,与DB的连接,PHP文件等)都采用UTF-8格式,序列化也应该有效。


答案 2

我认为除非你绝对需要保留php特定的类型,否则这就是在MySQL中的单个字段中存储结构化数据的方法。原因如下:json_encode()

https://dev.mysql.com/doc/refman/5.7/en/json.html

从MySQL 5.7.8开始,MySQL支持RFC 7159定义的本机JSON数据类型,该数据类型可以有效地访问JSON(JavaScript对象表示法)文档中的数据。

如果您使用的是支持新JSON数据类型的MySQL版本,则可以从该功能中受益。

另一个重要的考虑因素是能够对这些 JSON 字符串执行更改。假设您有一个 URL 存储在整个数据库中的编码字符串中。曾经尝试过将现有数据库迁移到新域名的Wordpress用户可能会在这里表示同情。如果它被序列化,它将破坏一些东西。如果是JSON,您只需运行查询即可,一切都会好起来的。例:REPLACE()

$arr = ['url' => 'http://example.com'];
$ser = serialize($arr);
$jsn = json_encode($arr);

$ser = str_replace('http://','https://',$ser);
$jsn = str_replace('http://','https://',$jsn);

print_r(unserialize($ser));
PHP Notice:  unserialize(): Error at offset 39 of 43 bytes in /root/sandbox/encoding.php on line 10
print_r(json_decode($jsn,true));

数组 ( [url] = > https://example.com )


推荐