patternsqlMinor
Insert escaped double quotes into MySQL JSON field
Viewed 0 times
fieldinsertintoquotesescapedmysqldoublejson
Problem
I am trying to insert a stringified JSON which looks like this:
into a MySQL JSON field, but I always get the error:
SQL Error (3140): Invalid JSON text: "Missing a comma or '}' after an object member."
at position 24 in value (or column) '{"test": "string with "escaped quotes" does not work"}'.
Any idea what might be causing the issue?
The full
'{"test": "string with \"escaped quotes\" does not work"}'
into a MySQL JSON field, but I always get the error:
SQL Error (3140): Invalid JSON text: "Missing a comma or '}' after an object member."
at position 24 in value (or column) '{"test": "string with "escaped quotes" does not work"}'.
Any idea what might be causing the issue?
The full
INSERT statement is:INSERT INTO test(json_test)
VALUES ('{"test": "string with \"escaped quotes\" does not work"}');Solution
Let's create the table:
And insert some JSON data/objects:
As you can see here you have to use the double backslash escape sequence because you don't want the SQL parser to perform the standard escape sequence processing but instead you want to pass the literal string containing the escape sequence down to the storage engine for the JSON data type processing.
I'll talk to the MySQL docs team about adding some examples and explanation for that here:
12.6 The JSON Data Type - Creating JSON Values
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)And insert some JSON data/objects:
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)As you can see here you have to use the double backslash escape sequence because you don't want the SQL parser to perform the standard escape sequence processing but instead you want to pass the literal string containing the escape sequence down to the storage engine for the JSON data type processing.
I'll talk to the MySQL docs team about adding some examples and explanation for that here:
12.6 The JSON Data Type - Creating JSON Values
Code Snippets
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)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)Context
StackExchange Database Administrators Q#159675, answer score: 5
Revisions (0)
No revisions yet.