Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在json列中使用双引号和反斜杠按键提取值_Mysql_Mysql Json - Fatal编程技术网

Mysql 在json列中使用双引号和反斜杠按键提取值

Mysql 在json列中使用双引号和反斜杠按键提取值,mysql,mysql-json,Mysql,Mysql Json,我有一个表,包括这样的数据 | id | jdoc | +----+-------------------------------------------+ | 1 | {"simple": "val1", "h\"simple": "val2"} | | 1 | {"simple": "val1"

我有一个表,包括这样的数据

| id | jdoc                                |
+----+-------------------------------------------+
|  1 | {"simple": "val1", "h\"simple": "val2"}   |
|  1 | {"simple": "val1", "h\"simple": "val2"}   |
|  1 | {"simple": "val1", "h\\\"simple": "val2"} |
+----+-------------------------------------------+
jdoc
是json格式的列,我试图通过键获取值

我可以使用键
simple
从test2运行查询
选择jdoc->“$”simple”来获取值

但类似的查询不适用于检索键
“h\”simple“
例如,查询
从test2中选择jdoc->“$”h\“simple”返回一个空值列表,这清楚地表明查询没有命中正确的键

| jdoc->'$."h\"simple"' |
+-----------------------------+
| NULL                        |
| NULL                        |
| NULL                        |
+-----------------------------+
此外,我还尝试了基于以下内容的双引号和反斜杠转义查询:

从test2中选择jdoc->'$.“h\\\“simple”;

但它抱怨
错误:3143(42000):JSON路径表达式无效。错误位于字符位置13附近。

关于如何查询带有双引号和反斜杠等特殊字符的键,有什么建议吗?

下面是一个测试:

mysql> select json_extract(cast('{"simple": "val1", "h\\"simple": "val2"}' as json),
    '$."h\\"simple"') as h_simple;
+----------+
| h_simple |
+----------+
| "val2"   |
+----------+

在JSON路径表达式中需要一个文本
\
,以便将
转义为JSON。但是MySQL字符串将反斜杠视为特殊的,因此您必须使用双反斜杠来确保单个文本反斜杠通过MySQL的字符串文本解析器。

您能详细说明为什么需要双反斜杠吗?如有联系,将不胜感激。因为从中,看起来我只需要一个反斜杠来转义双引号,另一个反斜杠来转义反斜杠,应该是
“$。”h\\\*simple“
。该键只包含一个反斜杠和一个双引号
{“simple”:“val1”,“h\“simple”:“val2”}
我注意到在发布的示例中,你存储了
{“simple”:“val1”,“h\“simple”:“val2”}
,其中包含了双引号?我已经在上面的回答中解释过了。再次阅读你的答案,我想我的困惑是为什么“
{“simple”:“val1”,“h\\“simple”:“val2”}
存储为
{“simple”:“val1”,“h\”simple:“val2”}
。如果使用双反斜杠,我希望只存储双引号。为了确保MySQL中的单个文本反斜杠,数据库中存储的字符串中必须有单个文本反斜杠,因为这将转义文本双引号。否则,双引号是JSON字符串值的终止。