数据库中的JSON与序列化数组

时间:2009-08-20 14:53:49

标签: php mysql serialization mysql-json

在MySQL数据库与序列化数组中存储JSON数据有哪些优点和缺点?

11 个答案:

答案 0 :(得分:91)

  1. JSON encode()& decode()
    • PHP版本> = 5.0.0
      • 嵌套限制为20。
    • PHP版本> = 5.2.3
      • Nesting Limit of 128。
    • PHP版本> = 5.3.0
      • 嵌套限制为512。
    • 与PHP的序列化字符串相比,占用空间小。
  2. serialize()& unserialize()
    • PHP版本> = 4.0.0
      • PHP数据类型对象不会丢失方法。
      • __ wakeup()魔法方法调用任何反序列化的对象。 (非常强大)
      • 已经注意到,放入数据库的base64 encode字符串和使用此函数从数据库中取出的base64 decode字符串有时是最好的,因为处理一些空白字符。
  3. 选择权在你手中。

答案 1 :(得分:84)

Pro JSON:

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

Pro Serialized Array:

  • 反序列化比JSON解码更快

正如评论所示,JSON占用的空间比序列化数组少。我还检查了JSON或Serializing是否更快,令人惊讶的是,JSON编码比Serialize更快。然而,反序列化要比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>

答案 2 :(得分:29)

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

未来证明:获胜者JSON。 JSON是一个“标准”,从某种意义上说,Javascript是一个标准,并且不太可能在将来的任何时候发生变化。 PHP小组对序列化格式的未来没有做出任何承诺,虽然将来不太可能改变,但是单个组控制格式这一事实意味着你可能最终得到的数据是不可读的。

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

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

表现:谁知道,这取决于,个人资料。

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

答案 3 :(得分:7)

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

答案 4 :(得分:7)

您是否仅将数据用于PHP?如果是:数组,如果否:JSON。

Pro Array

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

Pro JSON

  • JSON以其他语言和网络语言知道
  • 数据库中的详细信息
  • 许多工具,如XML:JSON SChema

答案 5 :(得分:4)

在SO上有很多这样的问题。

Preferred method to store PHP arrays (json_encode vs serialize)

简而言之: JSON对于简单数据更好,但它不区分对象和关联数组之间的差异。序列化数据更大。

答案 6 :(得分:3)

使用json进行数组并使用Javascript或其他语言进行通信。对当前运行的脚本使用serialize for object或任何内部PHP工作。

答案 7 :(得分:2)

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

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

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

答案 8 :(得分:2)

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

解决方案违反了数据库规范化。您的数据库甚至不在first normal form中,因此您无法利用任何数据库功能,例如搜索。更好的方法是使用object relational mapping。那里有很好的图书馆 - 例如考虑doctrine ORM

答案 9 :(得分:1)

我刚刚遇到 php serialize 这个大问题。我在一个字段中存储了大量数据,我使用 unserialize 来读取。

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

所以我的观点是避免序列化。使用 JSON ,更安全,你不会对未来的专业问题感到头疼。

对我来说,不再是序列化

答案 10 :(得分:-5)

atm,json_encode()仅适用于UTF-8编码数据..因此,它不能编码“ñ”等字符,否则返回NULL