72

在 MySQL 数据库中存储 JSON 数据与在序列化数组中存储的优缺点是什么?

4

11 回答 11

95
  1. JSON编码() &解码()
    • PHP 版本 >= 5.0.0
      • 嵌套限制为 20。
    • PHP 版本 >= 5.2.3
      • 嵌套限制为 128。
    • PHP 版本 >= 5.3.0
      • 嵌套限制为 512。
    • 占用空间小 vs PHP 的序列化字符串。
  2. 序列化()和反序列化()
    • PHP 版本 >= 4.0.0
      • PHP 数据类型对象上的方法不会丢失。
      • __wakeup() 对正在反序列化的任何对象调用的魔术方法。(很强大)
      • 已经注意到,有时最好将base64 编码字符串放入数据库,然后使用此功能从数据库中取出base64 解码字符串,因为处理一些空白字符存在一些问题。

这是你的选择。

于 2009-11-12T10:02:23.337 回答
87

专业 JSON:

  • JSON 数据可以被许多不同的语言使用,而不仅仅是 PHP
  • JSON 数据是人类可读可写的。
  • 它占用的空间更少
  • 编码 JSON 比序列化更快

专业序列化数组:

  • 反序列化比 JSON 解码更快

正如评论所指出的,JSON 占用的空间比序列化数组少。我还检查了 JSON 或序列化是否更快,令人惊讶的是,JSON 编码比序列化更快。反序列化比 JSON 解码更快。

这是我用来测试的脚本:

<?php 
function runTime(){
      $mtime = microtime(); 
      $mtime = explode(' ', $mtime); 
      $mtime = $mtime[1] + $mtime[0]; 
      return $mtime; 
}
?> 
<pre>
<?php
$start = runTime();

$ser;

for($i=0; $i<1000; $i++){
    $a = array(a => 1, x => 10);
    $ser = serialize($a);
}
$total = runTime() - $start;
echo "Serializing 1000 times took \t$total seconds";
?>

<?php
$start = runTime();

$json;

for($i=0; $i<1000; $i++){
    $a = array(a => 1, x => 10);
    $json = json_encode($a);
}
$total = runTime() - $start;
echo "JSON encoding 1000 times took \t$total seconds";
?>

<?php
$start = runTime();

$ser;

for($i=0; $i<1000; $i++){
    $a = unserialize($ser);
}
$total = runTime() - $start;
echo "Unserializing 1000 times took \t$total seconds";
?>

<?php
$start = runTime();

$json;

for($i=0; $i<1000; $i++){
    $a = json_decode($json);
}
$total = runTime() - $start;
echo "JSON decoding 1000 times took \t$total seconds";
?>
</pre>
于 2009-08-20T15:00:02.897 回答
30

可移植性:优胜者 JSON。JSON 在更广泛的平台上受支持,而 PHP 反序列化仅由 PHP 支持(据我所知)。虽然可以解析任何语言中的任何一种格式,但 JSON 具有更多的预构建库。

未来证明:获胜者 JSON。JSON 是一个“标准”,因为 Javascript 是一个标准,并且在未来的任何时候都不太可能改变。PHP 小组没有对序列化格式的未来做出任何承诺,虽然它在未来不太可能改变,但一个小组控制格式的事实意味着您最终可能会得到不可读的未来数据。

富达:赢家 PHP。PHP 序列化将允许您使用原生 PHP 数据类型存储数据,包括自定义类定义的对象。JSON 仅允许您存储通用原始类型、原始类型列表(“数组”)和键/值对对象。如果您正在开发 PHP 应用程序,PHP 序列化可能会在这里提供一些优势。

文件大小:JSON 在这方面略胜一筹,因为 PHP 的当前序列化格式更加冗长(因为它存储了更多信息)。

性能:谁知道呢,这取决于个人资料。

结论:除非您有令人信服的理由使用 PHP 序列化,否则请使用 JSON。

于 2009-08-20T15:12:47.057 回答
7

JSON 更具可移植性,即您可以更轻松地从不同语言等中读取/写入它。如果您使用 PHP 序列化数组,您将只能轻松使用 PHP 来访问它。

于 2009-08-20T14:58:32.383 回答
7

您是否仅在 PHP 中使用您的数据?如果是:数组,如果不是:JSON。

专业阵列

  • 会话使用序列化:我认为它比 json_encode/decode 更快(不太确定)
  • PHP中数组上的许多函数(排序/合并/...)

专业 JSON

  • JSON 以其他语言和网络语言而闻名
  • 数据库中不那么冗长
  • 许多工具,例如 XML:JSON Schema
于 2009-08-20T15:15:14.573 回答
4

SO上有很多这样的问题。

存储 PHP 数组的首选方法(json_encode 与序列化)

简而言之:JSON 更适合简单数据,但它不区分对象和关联数组。序列化数据更大。

于 2009-08-20T15:02:02.333 回答
3

使用 json 进行数组和与 Javascript 或其他语言的通信。对当前运行的脚本使用对象或任何内部 PHP 工作的序列化。

于 2012-06-08T23:36:58.107 回答
2

如果你试图绕过 JSON.stringify(obj) 中的引号和特殊字符,你可以在 PHP 中使用它的数据库特定的转义方法来做到这一点。

<?php
mysql_real_escape_string(htmlspecialchars($value))
?>

您现在可以安全地存储它并在您读回它时对其进行解码

于 2011-11-16T23:39:12.973 回答
2

正如大多数答案已经指出的那样,JSON 胜过序列化。我认为最大的优势是它的平台独立性。您可能有其他应用程序与您的数据库通信,它们可能与 php 没有任何关系。

但是这两种解决方案都违反了数据库规范化。您的数据库甚至不会处于第一范式,因此您无法利用任何数据库功能,例如搜索。更好的方法是使用对象关系映射。那里有很好的库 - 考虑例如教义 ORM

于 2013-02-07T11:53:13.030 回答
1

我刚刚遇到了php serialize这个大问题。我在使用反序列化读取的单个字段中存储了大量数据。

发生的事情是我在那个领域得到了一些损坏的数据。使用“a”、“s”和“N”等代码序列化映射数据。如果存在损坏的数据,则映射失败。它将显示一个 php 错误,即 unserialize 函数由于字节码错误而无法工作。

所以我的意思是避免serialize。使用JSON更安全,而且您不会因未来的专业问题而烦恼。

对我来说,不再是serialize

于 2013-01-16T19:47:12.707 回答
-5

atm,json_encode() 仅适用于 UTF-8 编码的数据。因此,它不能编码诸如“ñ”之类的字符,否则它返回 NULL

于 2010-02-07T01:30:17.667 回答