【问题标题】:find json by key in mysql在mysql中按键查找json
【发布时间】:2018-08-31 10:03:34
【问题描述】:

我有一列配置文件,其中是 json。如何搜索所有字段以搜索特定尼克。尼克可以是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,
}

【问题讨论】:

  • “可以是utf-8,所以正则表达式不合适”...是什么让你得出这个结论?
  • @ADyson 因为 json 中的 utf-8 是 \u041d\u0438\u043a
  • 这意味着您没有在数据库中以 UTF8 格式存储/处理数据?数据库是 ANSI 还是什么,然后你在里面存储编码的 UTF8 字符串?目前尚不清楚为什么会发生您刚才描述的情况。如果您想在数据库中存储 UTF8 数据,允许数据库正确支持它是有意义的,然后您可以正常对值使用正则表达式。
  • @ADyson,MySQL 的正则表达式实现在 MySQL 8.0 之前不支持匹配 utf8 字符(参见stackoverflow.com/questions/19774618/…)。他们最近更改了用于实现正则表达式匹配的库,因此在 MySQL 8.0 中效果更好。
  • @BillKarwin 有趣,我不知道,谢谢。我承认自己更像是 SQL Server 的常客。

标签: mysql json database


【解决方案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 更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 2016-01-08
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多