在mysql中通过键查找json

时间:2018-08-31 10:03:34

标签: mysql json database

我有一栏资料是json。如何搜索所有字段以搜索特定的尼克。 Nick可以使用utf-8,因此正则表达式不适合该解决方案。

{
  "nick1": {
    "color": [
      1,
      1,
      1
    ],
    "highlight": [
      1,
      1,
      1
    ],
    "global": false,
  },
  "nick2": {
    "color": [
      1,
      0.15,
      0.15
    ],
    "highlight": [
      0.2,
      1,
      0.2
    ],
    "global": true,
  },
  "other_nick": {
    "color": [
      1,
      1,
      1
    ],
    "highlight": [
      1,
      1,
      1
    ],
    "global": false,
}

1 个答案:

答案 0 :(得分:1)

首先,您的JSON格式错误。您不能在对象的最后一个元素后面加上逗号。

  "global": false,
},

应该是

  "global": false
},

在最后几行附近您缺少右括号:

    "global": false,
}

应该是

    "global": false
  }
}

所以我想您不是不是,而是使用MySQL 5.7的JSON数据类型。如果是这样,则不允许您保存格式错误的JSON。会出现此错误:

  

错误3140(22032):无效的JSON文本:“缺少对象成员的名称。”列'...'的值在第138位。

更正格式后,便可以测试您的JSON。

mysql [localhost] {msandbox} (test) > create table j (j json);

mysql [localhost] {msandbox} (test) > insert into j set j = '...your json...';

然后我可以提取给定昵称的条目:

mysql [localhost] {msandbox} (test) > select j->'$.nick2' from j;
+------------------------------------------------------------------------+
| j->'$.nick2'                                                           |
+------------------------------------------------------------------------+
| {"color": [1, 0.15, 0.15], "global": true, "highlight": [0.2, 1, 0.2]} |
+------------------------------------------------------------------------+

如果我尝试为不存在的键提取路径,则会得到NULL:

mysql [localhost] {msandbox} (test) > select j->'$.nick3' from j;
+--------------+
| j->'$.nick3' |
+--------------+
| NULL         |
+--------------+

MySQL 5.7和更高版本支持->运算符。也可以作为功能JSON_EXTRACT()访问它。参见https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html

您可能会说:“我正在使用MySQL 5.6,我该怎么做?”

如果要在MySQL中使用JSON,则应升级到5.7或更高版本。 MySQL 5.6或更早版本中不支持JSON。如果要查看在MySQL 5.6中解析JSON所需的工作量,请查看此处的答案:How to get values from MySQL(5.6) column if that contains json document as string,并注意需要几个人的回答才能获得最终可用的功能。

我建议升级到MySQL 5.7的工作要比使用MySQL 5.6解析带有这些不可思议的存储函数的JSON花费的精力少。