将JSON字符串作为字段数据放在MySQL上

Par*_*oid 10 php mysql sql arrays json

我有这个想法,我使用PHP将多/非多维数组制作成JSON字符串json_encode,并将数据存储到我的SQL数据库中.

例如,我有一个名为'users'的表.表'users'有3个字段:id,name,data

使用php,我想获取用户John的数据: SELECT data FROM users WHERE name='john'

现在'data'字段的值/文本将如下所示: {"gender":"male","birthday":"8-Jan-1991","country":"UK","city":"London"}

我将使用PHP解码'data'字段json_decode,然后我将使用我自己的一个PHP函数将stdClass对象转换为数组.然后我可以在任何地方显示John的信息:$user['data']['country'].

这使我免受榛子在国家,城市,生日等数据库上创建额外的字段.但是它安全吗?使用此方法在MySQL上存储数据是否有任何缺点或问题.

Eri*_*itz 11

正确转义,你很好,但我必须补充一点,这是XML比json更好的格式,因为它也允许你在查询中使用xml中的数据

<?xml version="1.0" encoding="UTF-8" ?>
<user>
   <gender>male</gender>
   <birthday>8-Jan-1991</birthday>
   <country>UK</country>
   <city>London</city>
</user> 
Run Code Online (Sandbox Code Playgroud)

选择

SELECT ExtractValue(data, '//gender') AS gender FROM users WHERE name='john' AND EXTRACTVALUE(data, '//country') != 'UK';
Run Code Online (Sandbox Code Playgroud)

http://dev.mysql.com/doc/refman/5.1/en/xml-functions.html#function_extractvalue


Mic*_*mza 5

但它安全吗?

只要你正确地转义输入,使用适当的库来访问数据库(或者至少使用mysql_real_escape_string)然后是的,这是安全的.或者至少,在黑客攻击数据库方面,存储其他任何东西的风险并不大.

使用此方法在MySQL上存储数据是否有任何缺点或问题

是的,这里有几个:

  • 查询"数据"列中的任何内容都是不可能的,或者至少要困难得多.假设您想要所有居住在伦敦的用户.您必须获取整个数据库中的所有"数据"列并在PHP中进行搜索.

  • 在查询时,也无法按"数据"列中的任何内容进行排序.它必须在PHP中完成.

  • 您必须注意确保存储的数据以正确的格式存储.无论如何你应该这样做,但它确实消除了额外的保护,防止存储"坏"数据.

看起来你已经基本上把MySQL变成了NoSQL数据库.虽然我的经验有限,但能够在一定程度上对存储的文档/ JSON数据中的数据进行索引+排序.作为关系数据库,MySQL不能:它只能对定义的列进行排序+索引.你没有使用它的任何优势,即能够运行复杂的查询,你得到了最糟糕的MySQL,缩放的难度.

话虽这么说,如果你确定你永远不需要运行这样的查询,如果你把东西存储为JSON,它可能会更容易转移到NoSQL.

编辑:如果您担心使用空列空格,您可以随时添加表格.说一个用户地址表.如果您有时可能需要每个用户使用多个地址,这实际上是一种非常友好的方式.