web-dev-qa-db-fra.com

Insérer des guillemets doubles échappés dans le champ JSON MySQL

J'essaie d'insérer un JSON stringifié qui ressemble à ceci:

'{"test": "string with \"escaped quotes\" does not work"}'

dans un champ MySQL JSON, mais j'obtiens toujours l'erreur:

Erreur SQL (3140): texte JSON non valide: "Manquant une virgule ou '}' après un membre d'objet."
à la position 24 dans la valeur (ou colonne) '{"test": "la chaîne avec" guillemets échappés "ne fonctionne pas"}'.

Une idée de ce qui pourrait être à l'origine du problème?

L'instruction complète INSERT est:

INSERT INTO test(json_test)
VALUES ('{"test": "string with \"escaped quotes\" does not work"}');
4
Ruehri

Créons la table:

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)

Et insérez des données/objets 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)

Comme vous pouvez le voir ici, vous devez utiliser la séquence d'échappement à double barre oblique inverse, car vous ne voulez pas que l'analyseur SQL effectue le traitement de séquence d'échappement standard, mais à la place, vous voulez transmettre la chaîne littérale contenant la séquence d'échappement au moteur de stockage pour le Traitement du type de données JSON.

Je parlerai à l'équipe de documentation MySQL de l'ajout d'exemples et d'explications à ce sujet ici:

12.6 Le type de données JSON - Création de valeurs JSON

3
Matt Lord

Je voudrais ajouter que la valeur qui est insérée dans le tableau en utilisant doubles barres obliques

INSERT INTO jsontest(value) 
VALUES ('{"test": "string with \\"escaped quotes\\" does not work"}');

... serait toujours {"test": "string with \"escaped quotes\" does not work"} qui est un format Json valide.

C'est la façon dont nous interrogeons les données insérées qui fait la différence ici:

Exemple

mysql> select id, value->>"$.test" from jsontest;

donne:

"string with "escaped quotes" does not work"

en sortie, mais si nous interrogeons:

mysql>select value from jsontest;

... il reflétera toujours {"test": "string with \"escaped quotes\" does not work"} en sortie. La bonne chose est d'utiliser le type Json, nous pouvons directement interroger et extraire des valeurs par rapport aux clés correspondantes:

mysql> SELECT JSON_EXTRACT('{"id": 14, "SampleKey": "SampleValue"}', '$.SampleKey');

Donne "SampleValue" en sortie.

Pour utiliser le type de données Json, la chaîne insérée doit être un Json valide et correctement formaté.

0
Shivam Kumar