php如何通过mysql存储和读取json数据?
Posted
技术标签:
【中文标题】php如何通过mysql存储和读取json数据?【英文标题】:php how to store and read json data via mysql? 【发布时间】:2011-11-27 23:14:08 【问题描述】:
mysql_query("INSERT INTO text (data) VALUES (json_encode('id' => $uid, 'value' => yes))");
那么,如何更新data
值?读出数据,然后用 json_encode 和解码过程插入,还是只有简单的方法更新?
["id": "1", "value": "yes"]
然后将另一个更改插入到["id": "1", "value": "yes","id": "2", "value": "yes"]
...
或者即使是 long long 值。
["id": "1", "value": "yes","id": "2", "value": "yes"..."id": "10000", "value": "yes"]
然后再更新一个,改成["id": "1", "value": "yes","id": "2", "value": "yes"..."id": "10000", "value": "yes","id": "10001", "value": "yes"]
我想问一下,如何让这个mysql查询处理更聪明高效?感谢您提供更多建议。
【问题讨论】:
【参考方案1】:从技术上讲,您这样做是错误的。 MySQL 用于分别存储您的每个 ID/VALUE。为了不更改您的代码,我们将首先查看您的解决方案,然后我将解释“更好”的方法。
首先,您需要将 JSON 作为变量,而不是 SQL 的一部分:
mysql_query("INSERT INTO text (data) VALUES (".mysql_real_escape_string(array(json_encode('id' => $uid, 'value' => 'yes'))).")");
而不是
mysql_query("INSERT INTO text (data) VALUES (json_encode('id' => $uid, 'value' => yes))");
这第一部分将允许您至少将数据正确地导入 mysql。 我假设您的表有一个 ID,并且您将使用它来更新或删除
当您检索数据时,您可以json_decode
和$row['data']
从行中取回数据并使用它。要更新它,只需:
mysql_query("UPDATE text SET data = "'.mysql_real_escape_string(json_encode($myJsonToBeData)).'" WHERE rowid = '.$myrowid)
现在,正确的做法是:
正确的做法是将这些字段放入您的表中:ID、JSONID、JSONVALUE 并改用此 SQL:
SELECT * FROM text WHERE id = $rowid
INSERT INTO text VALUES(NULL, $jsonid, $jsonvalue)
UPDATE text SET jsonid = $jsonid, jsondata = $jsondata
这是非常基本的,但它允许您在数据库中拥有任意数量的条目,使其可搜索、索引、排序、查询等......
【讨论】:
我相信您的第一个代码示例中多了一个单引号【参考方案2】:您可以通过不在单个字段中存储 JSON 而是通过使用 JSON 对象的属性名称作为字段名称创建适当的 MySQL 表来更有效地做到这一点。
将数据的文本字符串编码表示形式存储在数据库中完全破坏了首先使用数据库的意义。
【讨论】:
MongoDb 使用二进制 JSON 存储格式。所以我不得不不同意你的第二点,即在 JSON 中存储数据是一个坏主意。对于 MySQL(和其他 sql contagions),您的观点是有效的。 这个问题(和我的回答)专门针对 MySQL,以及存储编码为 JSON 字符串的数据。此外,正如您自己所说,MongoDb 将“JSON”存储为二进制对象,而不是 JSON 字符串,因此在 MongoDb 中存储“JSON”并不是存储编码为字符串的数据(这仍然是不好的做法,会破坏 database normalisation)。 如果我不知道会有多少字段,我会不同意怎么办?因此最好的方法是保存所有 json。 有没有在mysql中保存JSON对象的例子?我该怎么做? 大多数场景都不是非黑即白的,这绝对是其中之一。如果每个键值对是有益的,甚至避免痛苦的使用和管理,则不应将数组结构存储在单个字段中,因为它们是单独的行。例如。经常添加/删除更多。但是,当场景正确时,单个字段中的 Json 对象肯定会占有一席之地。它避免了一个可能毫无意义的表来存储配对,因为这样你就有了一个带有 ID 和 value 列的新表。 Symfony 用户角色是适合使用 Json 字段的一个很好的例子。【参考方案3】:是的,但是....WordPress 将其大量数据存储为编码的 JSON 字符串,例如用户功能。将数组存储为离散的数据位无需对数据库进行多次读取,并允许您在一次读取时获得大量数据。如果您从来没有看到需要选择 JSON 字符串的各个部分,我不明白为什么这样做是不可接受的。 MySQL 也必须这么想,因为它具有允许在 JSON 字符串中的各个字段上执行 SELECT 的功能(请参阅 MySQL EXPLAIN 关键字)。但是我同意如果你要在一个字段上做很多选择,它应该有自己的一个。这完全取决于您将如何使用这些数据。
【讨论】:
Wordpress 不会将大量数据存储为 json 字符串,他使用内部序列化/反序列化机制 :) @Mathieu - 我说它是“编码的 JSON”,这意味着使用 searialize/unserialize。看看 MySQL 中的 EXPLAIN 关键字。【参考方案4】:假设您想在 MySQL 中将 JSON 字符串存储为 text 或 varchar 数据类型,您可以像这样简单地转义 JSON 字符串:
存储
$object = new stdClass();
$object->key_a = "Value A";
$object->key_b = "Value B";
$storable_json_string = trim( addslashes( json_encode( $object ) ) );
// `$storable_json_string` contains an ugly invalid JSON
mysqli_query( "INSERT INTO table_a (column_a) VALUES ('$storable_json_string')" );
阅读
// read from the database
$result = mysqli_query( "SELECT column_a FROM table_a" );
$row = $result->fetch_object();
// makeover the ugly invalid JSON into a machine readable valid JSON
$valid_json_string = substr( stripslashes( $row->column_a ), 1, -1 );
// makes the JSON as a php object
$readable_json_object = json_decode( $valid_json_string );
echo $readable_json_object->key_a; // Value A
这可能不是那么安全,但至少这些应该给你一些垫脚石。
【讨论】:
以上是关于php如何通过mysql存储和读取json数据?的主要内容,如果未能解决你的问题,请参考以下文章
如果将json格式数据存储到类似mysql这样的关系型数据库中,怎么查