将转义的双引号插入 MySQL JSON 字段

Rue*_*hri 5 mysql insert json mysql-5.7

我正在尝试插入一个字符串化的 JSON,如下所示:

'{"test": "string with \"escaped quotes\" does not work"}'
Run Code Online (Sandbox Code Playgroud)

进入 MySQL JSON 字段,但我总是收到错误消息:

SQL 错误 (3140):无效的 JSON 文本:“对象成员后缺少逗号或‘}’。”
在值(或列)中的位置 24 '{"test": "带有"转义引号"的字符串不起作用"}'。

知道什么可能导致问题吗?

完整的INSERT声明是:

INSERT INTO test(json_test)
VALUES ('{"test": "string with \"escaped quotes\" does not work"}');
Run Code Online (Sandbox Code Playgroud)

Mat*_*ord 5

让我们创建表:

mysql> create table jsontest (id serial, value json);
Query OK, 0 rows affected (0.02 sec)

mysql> show create table jsontest\G
*************************** 1. row ***************************
Table: jsontest
Create Table: CREATE TABLE `jsontest` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `value` json DEFAULT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

并插入一些 JSON 数据/对象:

mysql> INSERT INTO jsontest(value) VALUES (JSON_OBJECT('test', 'string with "escaped quotes" does not work'));
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO jsontest(value) VALUES ('{"test": "string with \\"escaped quotes\\" does not work"}');
Query OK, 1 row affected (0.01 sec)

mysql> select id, value->>"$.test" from jsontest;
+----+--------------------------------------------+
| id | value->>"$.test"                           |
+----+--------------------------------------------+
|  2 | string with "escaped quotes" does not work |
|  9 | string with "escaped quotes" does not work |
+----+--------------------------------------------+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

正如您在这里所看到的,您必须使用双反斜杠转义序列,因为您不希望 SQL 解析器执行标准转义序列处理,而是希望将包含转义序列的文字字符串传递到存储引擎以用于JSON 数据类型处理。

我将与 MySQL 文档团队讨论如何在此处添加一些示例和解释:

12.6 JSON 数据类型 - 创建 JSON 值