web-dev-qa-db-ja.com

エスケープされた二重引用符をMySQL JSONフィールドに挿入する

次のような文字列化されたJSONを挿入しようとしています。

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

mySQLのJSONフィールドに入れますが、常にエラーが発生します:

SQLエラー(3140):無効なJSONテキスト:「オブジェクトメンバーの後にカンマまたは '}'がありません。」
値(または列)の24桁目 '{"test": ""引用符がエスケープされた "文字列は機能しません"}'。

問題の原因は何ですか?

完全なINSERTステートメントは次のとおりです。

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

テーブルを作成しましょう:

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)

そしていくつかの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)

ここでわかるように、SQLパーサーに標準のエスケープシーケンス処理を実行させたくないので、エスケープシーケンスを含むリテラル文字列をストレージエンジンに渡したいので、二重のバックスラッシュエスケープシーケンスを使用する必要があります。 JSONデータ型の処理。

MySQLのドキュメントチームに、そのためのいくつかの例と説明の追加についてここで話します。

12.6 JSONデータ型-JSON値の作成

3
Matt Lord

ダブルスラッシュを使用してテーブルに挿入される値を追加したいと思います

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

...それでも{"test": "string with \"escaped quotes\" does not work"}は有効なJson形式です。

ここで違いを生んでいるのは、挿入されたデータをクエリする方法です:

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

与える:

"string with "escaped quotes" does not work"

asoutputですが、クエリすると:

mysql>select value from jsontest;

...まだ反映されます{"test": "string with \"escaped quotes\" does not work"}出力として。良い点は、対応するキーに対して値を直接クエリおよび抽出できるJsonタイプを使用することです。

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

"SampleValue"出力として。

Jsonデータ型を使用するには、挿入される文字列が有効で適切にフォーマットされたJsonである必要があります。

0
Shivam Kumar