在 MySQL 数据库中存储 JSON 数据与在序列化数组中存储的优缺点是什么?
11 回答
专业 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>
可移植性:优胜者 JSON。JSON 在更广泛的平台上受支持,而 PHP 反序列化仅由 PHP 支持(据我所知)。虽然可以解析任何语言中的任何一种格式,但 JSON 具有更多的预构建库。
未来证明:获胜者 JSON。JSON 是一个“标准”,因为 Javascript 是一个标准,并且在未来的任何时候都不太可能改变。PHP 小组没有对序列化格式的未来做出任何承诺,虽然它在未来不太可能改变,但一个小组控制格式的事实意味着您最终可能会得到不可读的未来数据。
富达:赢家 PHP。PHP 序列化将允许您使用原生 PHP 数据类型存储数据,包括自定义类定义的对象。JSON 仅允许您存储通用原始类型、原始类型列表(“数组”)和键/值对对象。如果您正在开发 PHP 应用程序,PHP 序列化可能会在这里提供一些优势。
文件大小:JSON 在这方面略胜一筹,因为 PHP 的当前序列化格式更加冗长(因为它存储了更多信息)。
性能:谁知道呢,这取决于个人资料。
结论:除非您有令人信服的理由使用 PHP 序列化,否则请使用 JSON。
JSON 更具可移植性,即您可以更轻松地从不同语言等中读取/写入它。如果您使用 PHP 序列化数组,您将只能轻松使用 PHP 来访问它。
您是否仅在 PHP 中使用您的数据?如果是:数组,如果不是:JSON。
专业阵列
- 会话使用序列化:我认为它比 json_encode/decode 更快(不太确定)
- PHP中数组上的许多函数(排序/合并/...)
专业 JSON
- JSON 以其他语言和网络语言而闻名
- 数据库中不那么冗长
- 许多工具,例如 XML:JSON Schema
使用 json 进行数组和与 Javascript 或其他语言的通信。对当前运行的脚本使用对象或任何内部 PHP 工作的序列化。
如果你试图绕过 JSON.stringify(obj) 中的引号和特殊字符,你可以在 PHP 中使用它的数据库特定的转义方法来做到这一点。
<?php
mysql_real_escape_string(htmlspecialchars($value))
?>
您现在可以安全地存储它并在您读回它时对其进行解码
我刚刚遇到了php serialize这个大问题。我在使用反序列化读取的单个字段中存储了大量数据。
发生的事情是我在那个领域得到了一些损坏的数据。使用“a”、“s”和“N”等代码序列化映射数据。如果存在损坏的数据,则映射失败。它将显示一个 php 错误,即 unserialize 函数由于字节码错误而无法工作。
所以我的意思是避免serialize。使用JSON更安全,而且您不会因未来的专业问题而烦恼。
对我来说,不再是serialize。
atm,json_encode() 仅适用于 UTF-8 编码的数据。因此,它不能编码诸如“ñ”之类的字符,否则它返回 NULL