在mysql中按键查找json

2guxujil  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(333)

我有一列配置文件,其中是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,
}
kq0g1dla

kq0g1dla1#

首先,你的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         |
+--------------+

这个 -> MySQL5.7及更高版本支持运算符。它也可以作为函数访问 JSON_EXTRACT() . 看到了吗https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html
你可能会说,“我使用的是MySQL5.6,我怎么能做同样的事情呢?”
如果您想在mysql中使用json,应该升级到5.7或更高版本。MySQL5.6或更早版本中不支持json。如果您想了解在MySQL5.6中解析json所需的工作量,请看下面的答案:how to get Value from mysql(5.6)column if that contains json document as string and notice it take some people's answers to get a function that finally work.如果MySQL5.6中包含json文档作为字符串,请注意,需要几个人的回答才能得到最终工作的。
我建议升级到MySQL5.7要比使用MySQL5.6解析json这种神秘的存储函数轻松得多。

相关问题