我有一栏资料是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,
}
答案 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花费的精力少。