JSON与数据库中的序列化数组
在MySQL数据库和序列化数组中存储JSON数据的优缺点是什么?
- JSON 编码 ()和解码 ()
- PHP版本> = 5.0.0
- 嵌套限制20。
- PHP版本> = 5.2.3
- 嵌套限制128。
- PHP版本> = 5.3.0
- 嵌套限制512。
- 占用空间小于PHP的序列化string。
- PHP版本> = 5.0.0
- serialize ()& unserialize ()
- PHP版本> = 4.0.0
- PHP数据types对象不会丢失方法。
- 对任何正在反序列化的对象调用__wakeup()魔术方法。 (很强大)
- 已经注意到,将base64编码string放到数据库中是最好的,而用这个函数从base64中解码出来的string,因为处理一些空白字符有一些问题。
- PHP版本> = 4.0.0
这是你的select。
Pro JSON:
- JSON数据可以被许多不同的语言使用,而不仅仅是PHP
- JSON数据是人类可读和可写的。
- 它占用更less的空间
- 编码JSON比序列化更快
Pro序列化arrays:
- 反序列化比JSON解码更快
正如注释所示,JSON占用的空间比序列化数组less。 我还检查了JSON或序列化是否更快,而令人惊讶的是,JSON编码比序列化更快。 反序列化比JSON解码更快。
这是我用来testing的脚本:
<?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支持(据我所知)。 虽然可以用任何语言parsing任何格式,但JSON有更多的预build库。
未来certificate:赢家JSON。 JSON是一个“标准”,因为Javascript是一个标准,在将来不可能随时改变。 PHP团队对序列化格式的未来没有任何承诺,虽然未来不太可能发生变化,但单一组织控制格式的事实意味着您最终可能会遇到无法读取的未来数据。
富达:赢家PHP。 PHP序列化将允许您使用本地PHP数据types(包括由自定义类定义的对象)存储数据。 JSON将只允许您存储通用基元types,基元types列表(“数组”)和键/值对象。 如果您正在开发PHP应用程序,PHP序列化可能会提供一些优势。
文件大小:JSON在这里有一个小小的胜利,因为PHP的当前序列化格式更加冗长(因为它存储更多的信息)。
表演:谁知道呢,这取决于个人资料。
结论:除非您有足够的理由使用PHP序列化,否则请使用JSON。
JSON更具可移植性,也就是说,你可以更容易地从不同的语言读取/写入它。如果你使用PHP序列化数组,你将只能使用PHP来访问它。
你只用PHP使用你的数据? 如果是:数组,如果不是:JSON。
Proarrays
- 会话使用序列化:我认为它比json_encode / decode(不太确定)
- PHP中的数组上的许多函数(sorting/合并/ …)
临JSON
- JSON在其他语言和Web语言中是已知的
- 在数据库中较less冗长
- 许多工具,如XML:JSON SChema
SO上有很多这样的问题。
首选的方法来存储PHP数组(json_encode与序列化)
简而言之:JSON对于简单的数据更好,但是它不区分对象和关联数组之间的区别。 序列化数据更大。
使用json进行数组和使用Javascript或其他语言进行通信。 使用序列化对象或任何内部PHP工作的当前运行脚本。
如果您试图绕过JSON.stringify(obj)中的引号和特殊字符,则可以使用PHP的特定于数据库的转义方法在PHP中执行此操作。
<?php mysql_real_escape_string(htmlspecialchars($value)) ?>
您现在可以安全地存储这些内容,并在您将其读取后进行解码
JSON跳动序列化,因为大多数答案已经指出。 我认为最大的优势是它的平台独立性。 您可能有其他应用程序与您的数据库沟通,他们可能没有任何关系与PHP。
但这两种解决scheme都违反了数据库规范化 你的数据库甚至不会是第一个正常的forms,所以你不能利用任何数据库function,比如search。 更好的方法是使用对象关系映射 。 那里有好的图书馆 – 例如教条ORM 。
我刚刚有这个与PHP序列化的大问题。 我在单个字段中存储了大量的数据,在这个字段中,我使用反序列化来读取数据。
发生了什么事是我在这个领域有一些腐败的数据。 序列化使用诸如“a”,“s”和“N”之类的代码映射数据。 如果数据损坏,则映射失败。 它会显示一个PHP错误,反序列化函数由于字节码错误而无法工作。
所以我的观点是避免序列化 。 与JSON一起去,方式更安全,你不会在未来的专业问题上轰动。
对我来说,没有更多的序列化 。
atm,json_encode()只能使用UTF-8编码的数据,因此它不能编码“ñ”等字符,否则返回NULL