次のような文字列化された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"}');
テーブルを作成しましょう:
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のドキュメントチームに、そのためのいくつかの例と説明の追加についてここで話します。
ダブルスラッシュを使用してテーブルに挿入される値を追加したいと思います
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である必要があります。