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"}');
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:
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:
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é.