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

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

46143 次浏览

JSON 更具可移植性,也就是说,您可以更容易地从不同的语言对其进行读/写操作。如果您使用 PHP 序列化数组,那么您只能轻松地使用 PHP 来访问它。

支持者:

  • 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>

这样的问题有很多。

存储 PHP 数组的首选方法(json _ encode vs Series)

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

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

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

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

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

性能: 谁知道呢,看情况,侧写。

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

您只在 PHP 中使用数据吗? 如果是: 数组,如果不是: JSON。

专业阵列

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

Pro JSON

  • JSON 在其他语言和 Web 语言中也是知名的
  • 数据库中较少的详细信息
  • 许多工具,如 XML: JSON 模式
  1. JSON 编码() & 解码()
    • PHP 版本 > = 5.0.0
      • 筑巢限额20。
    • PHP 版本 > = 5.2.3
      • 筑巢限额为128。
    • PHP Version > = 5.3.0
      • 筑巢限额512。
    • 占用空间小与 PHP 的序列化字符串。
  2. 序列化 () & 取消连载()
    • PHP 版本 > = 4.0.0
      • PHP 数据类型对象中不会丢失方法。
      • _ _ wakeup ()魔法方法调用任何正在取消序列化的对象
      • 已经注意到,有时最好将 Base64编码字符串放入数据库,并将 Base64解码器字符串从数据库中取出,因为在处理一些空白字符时存在一些问题。

选择权在你。

Atm,json _ encode ()只能处理 UTF-8编码的数据. . 因此,它不能编码诸如“ ñ”之类的字符,否则返回 NULL

如果您试图避开 JSON.stringify (obj)中的引号和特殊字符,那么可以使用 PHP 中特定于数据库的转义方法。

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

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

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

我只是在 Php 序列化上遇到了一个大问题。我将大量数据存储在一个单独的字段中,在这个字段中我使用 取消连载进行读取。

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

所以我的观点是避免 连载。使用 JSON,更安全,你不会在未来的专业问题上撞到头。

对我来说,再也没有 连载了。

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

但是 都有解决方案 违反数据库规范化。您的数据库甚至不在 第一正规形式中,所以您不能利用任何数据库特性,比如说,搜索。更好的方法是使用 对象关系映射对象关系映射。有很多好的库-例如 原则 ORM