下面的查询有什么问题.

SELECT *
  FROM contract
  WHERE application_id="abcdef"
    AND JSON_CONTAINS(contract_details, '{"name":"~!@#$$%%^&*())_+?><,./:\";\'{}||}{"}');

我得到的错误如下.

SELECT * FROM contract where application_id="abcdef" and JSON_CONTAINS(contract_details, '{"name":"~!@#$$%%^&*())_+?><,./:\";\'{}||}{\"}')
 LIMIT 0, 10000 Error Code: 3141. Invalid JSON text in argument 2 to function json_contains: "Missing a comma or '}' after an object member." at position 34.   0.234 sec

我有一个列,其中包含Json对象数组,因为我希望根据名称及其值 Select 记录

推荐答案

JSON确实是无效的.

mysql> select json_valid('{"name":"~!@#$$%%^&*())_+?><,./:\";\'{}||}{\"}') valid;
+-------+
| valid |
+-------+
|     0 |
+-------+

如果需要在SQL字符串中使用文字反斜杠,则需要使用双反斜杠.

mysql> select json_valid('{"name":"~!@#$$%%^&*())_+?><,./:\\";\'{}||}{\"}') valid;
                                                          ^
+-------+
| valid |
+-------+
|     1 |
+-------+

您需要记住,有两个级别的判断.一种是MySQL字符串文字,另一种是JSON格式.反斜杠在两个级别都用作转义元字符.

如果需要反斜杠来转义JSON格式中的字符,则需要在文档中显示文字反斜杠字符.但是MySQL删除了反斜杠,因为它使用它来转义字符.

例如,因为字符串分隔符是',所以您需要转义字符串中的文字引号字符,以便MySQL知道它不是字符串分隔符.

'abc\'xyz'
    ^^ escaped quote

生成的字符串不包含反斜杠.它已被删除,因为MySQL语法将其视为转义.

但是,您还需要JSON有转义字符,因为它在文档语法中使用"作为JSON值的分隔符.

{"key": "abc\"xyz"} 
            ^^ escaped double-quote

当您将JSON文档作为MySQL字符串键入时,字符串文字计算将应用于它.反斜杠字符本身需要反斜杠,因此它仍然是JSON格式的单个文字反斜杠字符.

'{"key": "abc\\"xyz"}'
             ^^ escaped backslash, so a single backslash survives
                to escape the double-quote for JSON format

Mysql相关问答推荐

如何在循环查询中删除默认架构?

如何改进对另一个表中多行的查询依赖性

MySQL:返回所有条件(但不满足其他条件)为真的所有结果

在停靠容器中备份和恢复MySQL数据库时出现Unicode字符问题

MySQL逻辑全部

基于多行从表中 Select

使用 awk 重写 maxscale 过滤器

按唯一列排序,但保持匹配的列在一起

发生的原因及解决方法

使用mysql查询获取不关注user1的user3

数据导入和默认目标架构空列表. (Mysql 工作台 8)

基于其列之一内的值查询模型

估计对大表进行分区所需的时间

完全匹配 IN 子句中的所有值

根据使用 mysql 的第一个过滤结果添加更多表行

MySQL 视图

在 spring-boot jpa hibernate 中 >4<24 后与 Db 的连接终止

安装 mysql-python (Windows)

Python 是否支持 MySQL 准备好的语句?

SELECT INTO 和未声明的变量错误