最后一个重复键获胜。
11.6 The JSON Data Type :: Normalization, Merging, and Autowrapping of JSON Values
...
这种“最后一个重复键获胜”行为是 RFC 7159 建议的,并且由大多数 JavaScript 实现
解析器。
...
在 8.0.3 之前的 MySQL 版本中,具有与文档中较早发现的键重复的键的成员被丢弃。
...
示例:
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 8.0.15 |
+-----------+
1 row in set (0.00 sec)
mysql> SET @`example` := '{
'> "product": {
'> "id_product": 1,
'> "quantity": 1
'> },
'> "product": {
'> "id_product": 3,
'> "quantity": 4
'> },
'> "product": {
'> "id_product": 5,
'> "quantity": 2
'> }
'> }';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT JSON_VALID(@`example`);
+------------------------+
| JSON_VALID(@`example`) |
+------------------------+
| 1 |
+------------------------+
1 row in set (0.01 sec)
mysql> SELECT JSON_LENGTH(@`example`);
+-------------------------+
| JSON_LENGTH(@`example`) |
+-------------------------+
| 1 |
+-------------------------+
1 row in set (0.00 sec)
mysql> SELECT JSON_EXTRACT(@`example`, '$.product');
+---------------------------------------+
| JSON_EXTRACT(@`example`, '$.product') |
+---------------------------------------+
| {"quantity": 2, "id_product": 5} |
+---------------------------------------+
1 row in set (0.00 sec)
一些选项
选项 0:
mysql> SET @`example` := '{
'> "product_0": {
'> "id_product": 1,
'> "quantity": 1
'> },
'> "product_1": {
'> "id_product": 3,
'> "quantity": 4
'> },
'> "product_2": {
'> "id_product": 5,
'> "quantity": 2
'> }
'> }';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT JSON_VALID(@`example`);
+------------------------+
| JSON_VALID(@`example`) |
+------------------------+
| 1 |
+------------------------+
1 row in set (0.00 sec)
mysql> SELECT JSON_LENGTH(@`example`);
+-------------------------+
| JSON_LENGTH(@`example`) |
+-------------------------+
| 3 |
+-------------------------+
1 row in set (0.00 sec)
mysql> SELECT
-> JSON_EXTRACT(@`example`, '$.product_0.id_product'),
-> JSON_EXTRACT(@`example`, '$.product_1.id_product'),
-> JSON_EXTRACT(@`example`, '$.product_2.id_product')\G
*************************** 1. row ***************************
JSON_EXTRACT(@`example`, '$.product_0.id_product'): 1
JSON_EXTRACT(@`example`, '$.product_1.id_product'): 3
JSON_EXTRACT(@`example`, '$.product_2.id_product'): 5
1 row in set (0.00 sec)
选项 1:
mysql> SET @`example` := '[
'> {
'> "product": {
'> "id_product": 1,
'> "quantity": 1
'> }
'> },
'> {
'> "product": {
'> "id_product": 3,
'> "quantity": 4
'> }
'> },
'> {
'> "product": {
'> "id_product": 5,
'> "quantity": 2
'> }
'> }]';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT JSON_VALID(@`example`);
+------------------------+
| JSON_VALID(@`example`) |
+------------------------+
| 1 |
+------------------------+
1 row in set (0.00 sec)
mysql> SELECT JSON_LENGTH(@`example`);
+-------------------------+
| JSON_LENGTH(@`example`) |
+-------------------------+
| 3 |
+-------------------------+
1 row in set (0.00 sec)
mysql> SELECT
-> JSON_EXTRACT(@`example`, '$[0].product.id_product'),
-> JSON_EXTRACT(@`example`, '$[1].product.id_product'),
-> JSON_EXTRACT(@`example`, '$[2].product.id_product')\G
*************************** 1. row ***************************
JSON_EXTRACT(@`example`, '$[0].product.id_product'): 1
JSON_EXTRACT(@`example`, '$[1].product.id_product'): 3
JSON_EXTRACT(@`example`, '$[2].product.id_product'): 5
1 row in set (0.00 sec)