Hướng dẫn how do i access json in mysql? - làm cách nào để truy cập json trong mysql?

MySQL hỗ trợ kiểu dữ liệu

mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4 gốc được xác định bởi RFC 7159 cho phép truy cập hiệu quả vào dữ liệu trong các tài liệu JSON (ký hiệu đối tượng JavaScript). Kiểu dữ liệu
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4 cung cấp các lợi thế này so với việc lưu trữ các chuỗi định dạng JSON trong một cột chuỗi:

  • Xác thực tự động các tài liệu JSON được lưu trữ trong các cột

    mysql> SELECT JSON_TYPE('["a", "b", 1]');
    +----------------------------+
    | JSON_TYPE('["a", "b", 1]') |
    +----------------------------+
    | ARRAY                      |
    +----------------------------+
    
    mysql> SELECT JSON_TYPE('"hello"');
    +----------------------+
    | JSON_TYPE('"hello"') |
    +----------------------+
    | STRING               |
    +----------------------+
    
    mysql> SELECT JSON_TYPE('hello');
    ERROR 3146 (22032): Invalid data type for JSON data in argument 1
    to function json_type; a JSON string or JSON type is required.
    4. Tài liệu không hợp lệ tạo ra một lỗi.

  • Định dạng lưu trữ tối ưu hóa. Các tài liệu JSON được lưu trữ trong các cột

    mysql> SELECT JSON_TYPE('["a", "b", 1]');
    +----------------------------+
    | JSON_TYPE('["a", "b", 1]') |
    +----------------------------+
    | ARRAY                      |
    +----------------------------+
    
    mysql> SELECT JSON_TYPE('"hello"');
    +----------------------+
    | JSON_TYPE('"hello"') |
    +----------------------+
    | STRING               |
    +----------------------+
    
    mysql> SELECT JSON_TYPE('hello');
    ERROR 3146 (22032): Invalid data type for JSON data in argument 1
    to function json_type; a JSON string or JSON type is required.
    4 được chuyển đổi thành định dạng nội bộ cho phép truy cập đọc nhanh vào các thành phần tài liệu. Khi máy chủ sau đó phải đọc một giá trị JSON được lưu trữ ở định dạng nhị phân này, giá trị không cần phải phân tích từ biểu diễn văn bản. Định dạng nhị phân được cấu trúc để cho phép máy chủ tra cứu các tiểu mục hoặc giá trị lồng nhau trực tiếp bằng khóa hoặc chỉ mục mảng mà không cần đọc tất cả các giá trị trước hoặc sau khi chúng trong tài liệu.

MySQL 8.0 cũng hỗ trợ định dạng bản vá hợp nhất JSON được xác định trong RFC 7396, sử dụng hàm

mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
8. Xem mô tả của chức năng này, cũng như bình thường hóa, hợp nhất và tự động phát hiện các giá trị JSON, để biết các ví dụ và thông tin thêm.JSON Merge Patch format defined in RFC 7396, using the
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
8 function. See the description of this function, as well as Normalization, Merging, and Autowrapping of JSON Values, for examples and further information.

Ghi chú

Cuộc thảo luận này sử dụng

mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4 trong monotype để chỉ ra cụ thể loại dữ liệu JSON và JSON JSON, trong phông chữ thông thường để chỉ ra dữ liệu JSON nói chung.JSON in regular font to indicate JSON data in general.

Không gian cần thiết để lưu trữ một tài liệu

mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4 gần giống như đối với
mysql> SELECT JSON_ARRAY('a', 1, NOW());
+----------------------------------------+
| JSON_ARRAY('a', 1, NOW())              |
+----------------------------------------+
| ["a", 1, "2015-07-27 09:43:47.000000"] |
+----------------------------------------+
1 hoặc
mysql> SELECT JSON_ARRAY('a', 1, NOW());
+----------------------------------------+
| JSON_ARRAY('a', 1, NOW())              |
+----------------------------------------+
| ["a", 1, "2015-07-27 09:43:47.000000"] |
+----------------------------------------+
2; Xem Phần & NBSP; 11.7, Yêu cầu lưu trữ kiểu dữ liệu, để biết thêm thông tin. Điều quan trọng là phải nhớ rằng kích thước của bất kỳ tài liệu JSON nào được lưu trữ trong cột
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4 bị giới hạn ở giá trị của biến hệ thống
mysql> SELECT JSON_ARRAY('a', 1, NOW());
+----------------------------------------+
| JSON_ARRAY('a', 1, NOW())              |
+----------------------------------------+
| ["a", 1, "2015-07-27 09:43:47.000000"] |
+----------------------------------------+
4. . Lưu ý rằng đối với cột
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4, kích thước lưu trữ và do đó giá trị được trả về bởi hàm này, được sử dụng bởi cột trước khi cập nhật một phần có thể được thực hiện trên đó (xem thảo luận về tối ưu hóa một phần JSON sau này Phần này).

Trước MySQL 8.0.13, cột

mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4 không thể có giá trị mặc định không phải -____ ____ 68.

Cùng với kiểu dữ liệu

mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4, một tập hợp các hàm SQL có sẵn để cho phép các hoạt động trên các giá trị JSON, chẳng hạn như tạo, thao tác và tìm kiếm. Các cuộc thảo luận sau đây cho thấy các ví dụ về các hoạt động này. Để biết chi tiết về các chức năng riêng lẻ, xem Phần & NBSP; 12,18, Chức năng của JSON.

Một tập hợp các chức năng không gian để vận hành trên các giá trị Geojson cũng có sẵn. Xem Phần & NBSP; 12.17.11, Chức năng Geojson không gian.

Các cột

mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4, giống như các cột của các loại nhị phân khác, không được lập chỉ mục trực tiếp; Thay vào đó, bạn có thể tạo một chỉ mục trên một cột được tạo trích xuất giá trị vô hướng từ cột
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4. Xem lập chỉ mục một cột được tạo để cung cấp chỉ mục cột JSON, để biết ví dụ chi tiết.

Trình tối ưu hóa MySQL cũng tìm kiếm các chỉ mục tương thích trên các cột ảo phù hợp với các biểu thức JSON.

Trong MySQL 8.0.17 trở lên, công cụ lưu trữ

mysql> SELECT JSON_OBJECT('key1', 1, 'key2', 'abc');
+---------------------------------------+
| JSON_OBJECT('key1', 1, 'key2', 'abc') |
+---------------------------------------+
| {"key1": 1, "key2": "abc"}            |
+---------------------------------------+
2 hỗ trợ các chỉ mục đa giá trị trên các mảng JSON. Xem các chỉ mục đa giá trị.

MySQL NDB Cluster 8.0 hỗ trợ các chức năng

mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4 và các chức năng JSON của MySQL, bao gồm tạo một chỉ mục trên một cột được tạo từ cột
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4 dưới dạng cách giải quyết để không thể lập chỉ mục cột
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4. Tối đa 3 cột
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4 mỗi bảng
mysql> SELECT JSON_OBJECT('key1', 1, 'key2', 'abc');
+---------------------------------------+
| JSON_OBJECT('key1', 1, 'key2', 'abc') |
+---------------------------------------+
| {"key1": 1, "key2": "abc"}            |
+---------------------------------------+
7 được hỗ trợ.

Cập nhật một phần của các giá trị JSON

Trong MySQL 8.0, trình tối ưu hóa có thể thực hiện cập nhật một phần, tại chỗ của cột

mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4 thay vì xóa tài liệu cũ và viết toàn bộ tài liệu mới vào cột. Tối ưu hóa này có thể được thực hiện để cập nhật đáp ứng các điều kiện sau:

  • Cột đang được cập nhật được khai báo là

    mysql> SELECT JSON_TYPE('["a", "b", 1]');
    +----------------------------+
    | JSON_TYPE('["a", "b", 1]') |
    +----------------------------+
    | ARRAY                      |
    +----------------------------+
    
    mysql> SELECT JSON_TYPE('"hello"');
    +----------------------+
    | JSON_TYPE('"hello"') |
    +----------------------+
    | STRING               |
    +----------------------+
    
    mysql> SELECT JSON_TYPE('hello');
    ERROR 3146 (22032): Invalid data type for JSON data in argument 1
    to function json_type; a JSON string or JSON type is required.
    4.

  • Tuyên bố

    mysql> SELECT JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}');
    +-----------------------------------------------------+
    | JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}') |
    +-----------------------------------------------------+
    | ["a", 1, {"key": "value"}]                          |
    +-----------------------------------------------------+
    1 row in set (0.00 sec)
    0 sử dụng bất kỳ trong ba hàm
    mysql> SELECT JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}');
    +-----------------------------------------------------+
    | JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}') |
    +-----------------------------------------------------+
    | ["a", 1, {"key": "value"}]                          |
    +-----------------------------------------------------+
    1 row in set (0.00 sec)
    1,
    mysql> SELECT JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}');
    +-----------------------------------------------------+
    | JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}') |
    +-----------------------------------------------------+
    | ["a", 1, {"key": "value"}]                          |
    +-----------------------------------------------------+
    1 row in set (0.00 sec)
    2 hoặc
    mysql> SELECT JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}');
    +-----------------------------------------------------+
    | JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}') |
    +-----------------------------------------------------+
    | ["a", 1, {"key": "value"}]                          |
    +-----------------------------------------------------+
    1 row in set (0.00 sec)
    3 để cập nhật cột. Việc gán trực tiếp giá trị cột (ví dụ:
    mysql> SELECT JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}');
    +-----------------------------------------------------+
    | JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}') |
    +-----------------------------------------------------+
    | ["a", 1, {"key": "value"}]                          |
    +-----------------------------------------------------+
    1 row in set (0.00 sec)
    4) không thể được thực hiện dưới dạng cập nhật một phần.

    Cập nhật nhiều cột

    mysql> SELECT JSON_TYPE('["a", "b", 1]');
    +----------------------------+
    | JSON_TYPE('["a", "b", 1]') |
    +----------------------------+
    | ARRAY                      |
    +----------------------------+
    
    mysql> SELECT JSON_TYPE('"hello"');
    +----------------------+
    | JSON_TYPE('"hello"') |
    +----------------------+
    | STRING               |
    +----------------------+
    
    mysql> SELECT JSON_TYPE('hello');
    ERROR 3146 (22032): Invalid data type for JSON data in argument 1
    to function json_type; a JSON string or JSON type is required.
    4 trong một câu lệnh
    mysql> SELECT JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}');
    +-----------------------------------------------------+
    | JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}') |
    +-----------------------------------------------------+
    | ["a", 1, {"key": "value"}]                          |
    +-----------------------------------------------------+
    1 row in set (0.00 sec)
    0 có thể được tối ưu hóa theo kiểu này; MySQL có thể thực hiện cập nhật một phần chỉ các cột có giá trị được cập nhật bằng ba chức năng vừa được liệt kê.

  • Cột đầu vào và cột đích phải là cùng một cột; Một tuyên bố như

    mysql> SELECT JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}');
    +-----------------------------------------------------+
    | JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}') |
    +-----------------------------------------------------+
    | ["a", 1, {"key": "value"}]                          |
    +-----------------------------------------------------+
    1 row in set (0.00 sec)
    7 không thể được thực hiện dưới dạng cập nhật một phần.

    Bản cập nhật có thể sử dụng các cuộc gọi lồng vào bất kỳ chức năng nào được liệt kê trong mục trước, trong bất kỳ kết hợp nào, miễn là các cột đầu vào và mục tiêu là như nhau.

  • Tất cả các thay đổi thay thế các giá trị mảng hoặc đối tượng hiện có bằng các giá trị mới và không thêm bất kỳ phần tử mới nào vào đối tượng hoặc mảng cha.

  • Giá trị được thay thế phải ít nhất là lớn như giá trị thay thế. Nói cách khác, giá trị mới không thể lớn hơn giá trị cũ.

    Một ngoại lệ có thể xảy ra với yêu cầu này xảy ra khi bản cập nhật một phần trước đó đã để lại đủ không gian cho giá trị lớn hơn. Bạn có thể sử dụng chức năng

    mysql> SELECT JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}');
    +-----------------------------------------------------+
    | JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}') |
    +-----------------------------------------------------+
    | ["a", 1, {"key": "value"}]                          |
    +-----------------------------------------------------+
    1 row in set (0.00 sec)
    8 Xem số lượng không gian đã được giải phóng bởi bất kỳ bản cập nhật một phần nào của cột
    mysql> SELECT JSON_TYPE('["a", "b", 1]');
    +----------------------------+
    | JSON_TYPE('["a", "b", 1]') |
    +----------------------------+
    | ARRAY                      |
    +----------------------------+
    
    mysql> SELECT JSON_TYPE('"hello"');
    +----------------------+
    | JSON_TYPE('"hello"') |
    +----------------------+
    | STRING               |
    +----------------------+
    
    mysql> SELECT JSON_TYPE('hello');
    ERROR 3146 (22032): Invalid data type for JSON data in argument 1
    to function json_type; a JSON string or JSON type is required.
    4.

Các bản cập nhật một phần như vậy có thể được ghi vào nhật ký nhị phân bằng cách sử dụng định dạng nhỏ gọn giúp tiết kiệm không gian; Điều này có thể được bật bằng cách đặt biến hệ thống

mysql> SET @j = JSON_OBJECT('key', 'value');
mysql> SELECT @j;
+------------------+
| @j               |
+------------------+
| {"key": "value"} |
+------------------+
0 thành
mysql> SET @j = JSON_OBJECT('key', 'value');
mysql> SELECT @j;
+------------------+
| @j               |
+------------------+
| {"key": "value"} |
+------------------+
1.

Điều quan trọng là phải phân biệt cập nhật một phần của giá trị cột

mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4 được lưu trữ trong bảng từ việc viết bản cập nhật một phần của một hàng vào nhật ký nhị phân. Có thể cập nhật hoàn chỉnh cột
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4 được ghi lại trong nhật ký nhị phân dưới dạng cập nhật một phần. Điều này có thể xảy ra khi một trong hai (hoặc cả hai) của hai điều kiện cuối cùng từ danh sách trước đó không được đáp ứng nhưng các điều kiện khác được thỏa mãn.

Xem thêm mô tả của

mysql> SET @j = JSON_OBJECT('key', 'value');
mysql> SELECT @j;
+------------------+
| @j               |
+------------------+
| {"key": "value"} |
+------------------+
0.

Một vài phần tiếp theo cung cấp thông tin cơ bản liên quan đến việc tạo và thao tác các giá trị JSON.

Tạo giá trị JSON

Một mảng JSON chứa một danh sách các giá trị được phân tách bằng dấu phẩy và được đặt trong phạm vi

mysql> SET @j = JSON_OBJECT('key', 'value');
mysql> SELECT @j;
+------------------+
| @j               |
+------------------+
| {"key": "value"} |
+------------------+
5 và
mysql> SET @j = JSON_OBJECT('key', 'value');
mysql> SELECT @j;
+------------------+
| @j               |
+------------------+
| {"key": "value"} |
+------------------+
6:

["abc", 10, null, true, false]

Một đối tượng JSON chứa một tập hợp các cặp giá trị khóa được phân tách bằng dấu phẩy và được đặt trong các ký tự

mysql> SET @j = JSON_OBJECT('key', 'value');
mysql> SELECT @j;
+------------------+
| @j               |
+------------------+
| {"key": "value"} |
+------------------+
7 và
mysql> SET @j = JSON_OBJECT('key', 'value');
mysql> SELECT @j;
+------------------+
| @j               |
+------------------+
| {"key": "value"} |
+------------------+
8:

{"k1": "value", "k2": 10}

Như các ví dụ minh họa, các mảng và đối tượng JSON có thể chứa các giá trị vô hướng là chuỗi hoặc số, chữ JSON NULL theo nghĩa đen hoặc chữ JSON boolean đúng hoặc sai. Chìa khóa trong các đối tượng JSON phải là chuỗi. Các giá trị vô hướng tạm thời (ngày, giờ hoặc DateTime) cũng được cho phép:

["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]

Nesting được phép trong các phần tử mảng JSON và giá trị khóa đối tượng JSON:

[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}

Bạn cũng có thể lấy các giá trị JSON từ một số hàm do MySQL cung cấp cho mục đích này (xem Phần & NBSP; 12.18.2, các hàm tạo ra các giá trị JSON) cũng như bằng cách sử dụng các giá trị của các loại khác vào loại

mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4 ) (xem chuyển đổi giữa các giá trị JSON và không phải là JSON). Một số đoạn tiếp theo mô tả cách MySQL xử lý các giá trị JSON được cung cấp dưới dạng đầu vào.

Trong MySQL, các giá trị JSON được viết dưới dạng chuỗi. MySQL phân tích bất kỳ chuỗi nào được sử dụng trong bối cảnh yêu cầu giá trị JSON và tạo ra lỗi nếu nó không hợp lệ là JSON. Các bối cảnh này bao gồm chèn một giá trị vào một cột có kiểu dữ liệu

mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4 và chuyển một đối số cho một hàm mong đợi giá trị JSON (thường được hiển thị là
{"k1": "value", "k2": 10}
02 hoặc
{"k1": "value", "k2": 10}
03 trong tài liệu cho các hàm JSON của MySQL), như các ví dụ sau đây chứng minh:

  • Cố gắng chèn giá trị vào cột

    mysql> SELECT JSON_TYPE('["a", "b", 1]');
    +----------------------------+
    | JSON_TYPE('["a", "b", 1]') |
    +----------------------------+
    | ARRAY                      |
    +----------------------------+
    
    mysql> SELECT JSON_TYPE('"hello"');
    +----------------------+
    | JSON_TYPE('"hello"') |
    +----------------------+
    | STRING               |
    +----------------------+
    
    mysql> SELECT JSON_TYPE('hello');
    ERROR 3146 (22032): Invalid data type for JSON data in argument 1
    to function json_type; a JSON string or JSON type is required.
    4 thành công nếu giá trị là giá trị JSON hợp lệ, nhưng không thành công nếu không:

    mysql> CREATE TABLE t1 (jdoc JSON);
    Query OK, 0 rows affected (0.20 sec)
    
    mysql> INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> INSERT INTO t1 VALUES('[1, 2,');
    ERROR 3140 (22032) at line 2: Invalid JSON text:
    "Invalid value." at position 6 in value (or column) '[1, 2,'.

    Các vị trí cho vị trí tại vị trí

    {"k1": "value", "k2": 10}
    05, trong các thông báo lỗi như vậy là dựa trên 0, nhưng nên được coi là chỉ dẫn sơ bộ về nơi vấn đề trong một giá trị thực sự xảy ra.at position
    {"k1": "value", "k2": 10}
    05
    in such error messages are 0-based, but should be considered rough indications of where the problem in a value actually occurs.

  • Hàm

    {"k1": "value", "k2": 10}
    06 mong đợi một đối số JSON và cố gắng phân tích nó vào giá trị JSON. Nó trả về loại JSON của giá trị nếu nó hợp lệ và tạo ra lỗi nếu không:

    mysql> SELECT JSON_TYPE('["a", "b", 1]');
    +----------------------------+
    | JSON_TYPE('["a", "b", 1]') |
    +----------------------------+
    | ARRAY                      |
    +----------------------------+
    
    mysql> SELECT JSON_TYPE('"hello"');
    +----------------------+
    | JSON_TYPE('"hello"') |
    +----------------------+
    | STRING               |
    +----------------------+
    
    mysql> SELECT JSON_TYPE('hello');
    ERROR 3146 (22032): Invalid data type for JSON data in argument 1
    to function json_type; a JSON string or JSON type is required.

MySQL xử lý các chuỗi được sử dụng trong bối cảnh JSON bằng cách sử dụng bộ ký tự

{"k1": "value", "k2": 10}
07 và đối chiếu
{"k1": "value", "k2": 10}
08. Các chuỗi trong các bộ ký tự khác được chuyển đổi thành
{"k1": "value", "k2": 10}
07 khi cần thiết. .

Thay thế cho việc viết các giá trị JSON bằng cách sử dụng các chuỗi theo nghĩa đen, các hàm tồn tại để soạn các giá trị JSON từ các phần tử thành phần.

{"k1": "value", "k2": 10}
15 lấy danh sách các giá trị (có thể trống) và trả về mảng JSON chứa các giá trị đó:

mysql> SELECT JSON_ARRAY('a', 1, NOW());
+----------------------------------------+
| JSON_ARRAY('a', 1, NOW())              |
+----------------------------------------+
| ["a", 1, "2015-07-27 09:43:47.000000"] |
+----------------------------------------+

{"k1": "value", "k2": 10}
16 lấy một danh sách (có thể trống) của các cặp giá trị khóa và trả về một đối tượng JSON chứa các cặp đó:

mysql> SELECT JSON_OBJECT('key1', 1, 'key2', 'abc');
+---------------------------------------+
| JSON_OBJECT('key1', 1, 'key2', 'abc') |
+---------------------------------------+
| {"key1": 1, "key2": "abc"}            |
+---------------------------------------+

{"k1": "value", "k2": 10}
17 lấy hai hoặc nhiều tài liệu JSON và trả về kết quả kết hợp:

mysql> SELECT JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}');
+-----------------------------------------------------+
| JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}') |
+-----------------------------------------------------+
| ["a", 1, {"key": "value"}]                          |
+-----------------------------------------------------+
1 row in set (0.00 sec)

Để biết thông tin về các quy tắc hợp nhất, hãy xem chuẩn hóa, hợp nhất và tự động ra các giá trị JSON.

.

Các giá trị JSON có thể được gán cho các biến do người dùng xác định:

mysql> SET @j = JSON_OBJECT('key', 'value');
mysql> SELECT @j;
+------------------+
| @j               |
+------------------+
| {"key": "value"} |
+------------------+

Tuy nhiên, các biến do người dùng xác định không thể thuộc loại dữ liệu

mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4, do đó, mặc dù
{"k1": "value", "k2": 10}
20 trong ví dụ trước trông giống như giá trị JSON và có cùng một bộ ký tự và đối chiếu là giá trị JSON, nhưng nó không có kiểu dữ liệu
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4. Thay vào đó, kết quả từ
{"k1": "value", "k2": 10}
16 được chuyển đổi thành một chuỗi khi được gán cho biến.not have the
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
4 data type. Instead, the result from
{"k1": "value", "k2": 10}
16 is converted to a string when assigned to the variable.

Các chuỗi được tạo ra bằng cách chuyển đổi các giá trị JSON có một bộ ký tự là

{"k1": "value", "k2": 10}
07 và đối chiếu
{"k1": "value", "k2": 10}
08:

{"k1": "value", "k2": 10}
0

Bởi vì

{"k1": "value", "k2": 10}
08 là một đối chiếu nhị phân, so sánh các giá trị JSON nhạy cảm với trường hợp.

{"k1": "value", "k2": 10}
1

Độ nhạy của trường hợp cũng áp dụng cho JSON

{"k1": "value", "k2": 10}
26,
{"k1": "value", "k2": 10}
27 và
{"k1": "value", "k2": 10}
28, luôn phải được viết bằng chữ thường:

{"k1": "value", "k2": 10}
2

Độ nhạy của trường hợp của các chữ JSON khác với SQL

mysql> SELECT JSON_ARRAY('a', 1, NOW());
+----------------------------------------+
| JSON_ARRAY('a', 1, NOW())              |
+----------------------------------------+
| ["a", 1, "2015-07-27 09:43:47.000000"] |
+----------------------------------------+
8,
{"k1": "value", "k2": 10}
30 và
{"k1": "value", "k2": 10}
31, có thể được viết trong bất kỳ chữ cái nào:

{"k1": "value", "k2": 10}
3

Đôi khi có thể cần thiết hoặc mong muốn để chèn các ký tự trích dẫn (

{"k1": "value", "k2": 10}
32 hoặc
{"k1": "value", "k2": 10}
33) vào tài liệu JSON. Giả sử cho ví dụ này rằng bạn muốn chèn một số đối tượng JSON chứa các chuỗi đại diện cho các câu nêu một số sự thật về MySQL, mỗi đối tượng được ghép nối với một từ khóa thích hợp, vào một bảng được tạo bằng câu lệnh SQL được hiển thị ở đây:

{"k1": "value", "k2": 10}
4

Trong số các cặp từ khóa này là cái này:

{"k1": "value", "k2": 10}
5

Một cách để chèn đây là đối tượng JSON vào bảng

{"k1": "value", "k2": 10}
34 là sử dụng hàm MySQL
{"k1": "value", "k2": 10}
16. Trong trường hợp này, bạn phải thoát khỏi từng ký tự trích dẫn bằng cách sử dụng dấu gạch chéo ngược, như được hiển thị ở đây:

{"k1": "value", "k2": 10}
6

Điều này không hoạt động theo cùng một cách nếu bạn chèn giá trị là một đối tượng JSON theo nghĩa đen, trong trường hợp đó, bạn phải sử dụng chuỗi thoát hiểm gấp đôi, như thế này:

{"k1": "value", "k2": 10}
7

Sử dụng Double Backslash giúp MySQL thực hiện xử lý trình tự thoát, và thay vào đó khiến nó chuyển chuỗi theo nghĩa đen cho công cụ lưu trữ để xử lý. Sau khi chèn đối tượng JSON theo một trong hai cách vừa hiển thị, bạn có thể thấy rằng các dấu gạch chéo ngược có mặt trong giá trị cột JSON bằng cách thực hiện một

{"k1": "value", "k2": 10}
36 đơn giản, như thế này:

{"k1": "value", "k2": 10}
8

Để tra cứu câu cụ thể này sử dụng

{"k1": "value", "k2": 10}
37 làm khóa, bạn có thể sử dụng toán tử đường dẫn cột
{"k1": "value", "k2": 10}
38, như được hiển thị ở đây:

{"k1": "value", "k2": 10}
9

Điều này để lại các dấu gạch chéo ngược, cùng với các dấu ngoặc kép xung quanh. Để hiển thị giá trị mong muốn bằng cách sử dụng

{"k1": "value", "k2": 10}
37 làm khóa, nhưng không bao gồm các dấu ngoặc kép xung quanh hoặc bất kỳ lối thoát nào, hãy sử dụng toán tử đường dẫn nội tuyến
{"k1": "value", "k2": 10}
40, như thế này:

["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
0

Ghi chú

Ví dụ trước không hoạt động như được hiển thị nếu chế độ SQL máy chủ

{"k1": "value", "k2": 10}
41 được bật. Nếu chế độ này được đặt, một dấu gạch chéo ngược thay vì có thể sử dụng các dấu gạch chéo ngược gấp đôi để chèn theo nghĩa đen của đối tượng JSON và các dấu gạch chéo ngược được bảo tồn. Nếu bạn sử dụng chức năng
{"k1": "value", "k2": 10}
16 khi thực hiện chèn và chế độ này được đặt, bạn phải xen kẽ các trích dẫn đơn và đôi, như thế này:

["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
1

Xem mô tả của hàm

{"k1": "value", "k2": 10}
43 để biết thêm thông tin về tác động của chế độ này đối với các ký tự đã thoát trong các giá trị JSON.

Chuẩn hóa, hợp nhất và tự động ra giá trị JSON

Khi một chuỗi được phân tích cú pháp và được tìm thấy là một tài liệu JSON hợp lệ, nó cũng được chuẩn hóa. Điều này có nghĩa là các thành viên có các khóa sao chép một khóa được tìm thấy sau này trong tài liệu, đọc từ trái sang phải, bị loại bỏ. Giá trị đối tượng được tạo bởi cuộc gọi

{"k1": "value", "k2": 10}
16 sau đây chỉ bao gồm phần tử
{"k1": "value", "k2": 10}
45 thứ hai vì tên khóa đó xảy ra trước đó trong giá trị, như được hiển thị ở đây:

["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
2

Chuẩn hóa cũng được thực hiện khi các giá trị được chèn vào các cột JSON, như được hiển thị ở đây:

["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
3

Hành vi chính của bản sao cuối cùng của người Viking này được đề xuất bởi RFC 7159 và được thực hiện bởi hầu hết các trình phân tích cú pháp JavaScript. (Lỗi #86866, lỗi #26369555)last duplicate key wins behavior is suggested by RFC 7159 and is implemented by most JavaScript parsers. (Bug #86866, Bug #26369555)

Trong các phiên bản của MySQL trước 8.0.3, các thành viên có khóa đã nhân đôi một khóa được tìm thấy trước đó trong tài liệu đã bị loại bỏ. Giá trị đối tượng được tạo bởi cuộc gọi

{"k1": "value", "k2": 10}
16 sau không bao gồm phần tử
{"k1": "value", "k2": 10}
45 thứ hai vì tên khóa đó xảy ra trước đó trong giá trị:

["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
4

Trước MySQL 8.0.3, khóa bản sao đầu tiên này giành được sự chuẩn hóa của Wins cũng được thực hiện khi chèn các giá trị vào các cột JSON.first duplicate key wins normalization was also performed when inserting values into JSON columns.

["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
5

MySQL cũng loại bỏ thêm khoảng trắng giữa các khóa, giá trị hoặc các phần tử trong tài liệu JSON gốc và lá (hoặc chèn, khi cần thiết) một không gian sau mỗi dấu phẩy (

{"k1": "value", "k2": 10}
48) hoặc ruột kết (
{"k1": "value", "k2": 10}
49) khi hiển thị nó. Điều này được thực hiện để tăng cường khả năng đọc.

Các hàm MySQL tạo ra các giá trị JSON (xem Phần & NBSP; 12.18.2, các hàm tạo ra các giá trị JSON) luôn trả về các giá trị chuẩn hóa.

Để làm cho tra cứu hiệu quả hơn, MySQL cũng sắp xếp các phím của đối tượng JSON. Bạn nên lưu ý rằng kết quả của việc đặt hàng này có thể thay đổi và không được đảm bảo là nhất quán giữa các bản phát hành.You should be aware that the result of this ordering is subject to change and not guaranteed to be consistent across releases.

Hợp nhất các giá trị JSON

Hai thuật toán hợp nhất được hỗ trợ trong MySQL 8.0.3 (và sau đó), được thực hiện bởi các chức năng

{"k1": "value", "k2": 10}
17 và
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
8. Chúng khác nhau về cách chúng xử lý các khóa trùng lặp:
{"k1": "value", "k2": 10}
17 giữ lại các giá trị cho các khóa trùng lặp, trong khi
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
8 loại bỏ tất cả trừ giá trị cuối cùng. Một vài đoạn tiếp theo giải thích cách mỗi hai chức năng này xử lý việc hợp nhất các kết hợp khác nhau của các tài liệu JSON (nghĩa là, của các đối tượng và mảng).

Ghi chú

{"k1": "value", "k2": 10}
17 giống như hàm
{"k1": "value", "k2": 10}
55 được tìm thấy trong các phiên bản trước của MySQL (được đổi tên trong MySQL 8.0.3).
{"k1": "value", "k2": 10}
55 vẫn được hỗ trợ dưới dạng bí danh cho
{"k1": "value", "k2": 10}
17 trong MySQL 8.0, nhưng không được chấp nhận và có thể loại bỏ trong một bản phát hành trong tương lai.

Hợp nhất các mảng. & Nbsp; Trong các bối cảnh kết hợp nhiều mảng, các mảng được hợp nhất thành một mảng duy nhất.

{"k1": "value", "k2": 10}
17 thực hiện điều này bằng cách ghép các mảng được đặt tên sau này đến cuối mảng đầu tiên.
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
8 coi mỗi đối số là một mảng bao gồm một phần tử duy nhất (do đó có 0 làm chỉ mục của nó) và sau đó áp dụng khóa trùng lặp cuối cùng của WINS LOGIC để chỉ chọn đối số cuối cùng. Bạn có thể so sánh các kết quả được hiển thị bởi truy vấn này:
In contexts that combine multiple arrays, the arrays are merged into a single array.
{"k1": "value", "k2": 10}
17 does this by concatenating arrays named later to the end of the first array.
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
8 considers each argument as an array consisting of a single element (thus having 0 as its index) and then applies last duplicate key wins logic to select only the last argument. You can compare the results shown by this query:

["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
6

Nhiều đối tượng khi hợp nhất tạo ra một đối tượng.

{"k1": "value", "k2": 10}
17 xử lý nhiều đối tượng có cùng một khóa bằng cách kết hợp tất cả các giá trị duy nhất cho khóa đó trong một mảng; Mảng này sau đó được sử dụng làm giá trị cho khóa đó trong kết quả.
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
8 loại bỏ các giá trị mà các khóa trùng lặp được tìm thấy, hoạt động từ trái sang phải, để kết quả chỉ chứa giá trị cuối cùng cho khóa đó. Truy vấn sau đây minh họa sự khác biệt trong kết quả cho khóa trùng lặp
{"k1": "value", "k2": 10}
62:

["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
7

Các giá trị không được sử dụng trong bối cảnh yêu cầu giá trị mảng được tự động tạo ra: giá trị được bao quanh bởi các ký tự

mysql> SET @j = JSON_OBJECT('key', 'value');
mysql> SELECT @j;
+------------------+
| @j               |
+------------------+
| {"key": "value"} |
+------------------+
5 và
mysql> SET @j = JSON_OBJECT('key', 'value');
mysql> SELECT @j;
+------------------+
| @j               |
+------------------+
| {"key": "value"} |
+------------------+
6 để chuyển đổi nó thành một mảng. Trong câu lệnh sau, mỗi đối số được tự động tạo thành một mảng (
{"k1": "value", "k2": 10}
65,
{"k1": "value", "k2": 10}
66). Chúng sau đó được hợp nhất để tạo ra một mảng kết quả duy nhất; Như trong hai trường hợp trước,
{"k1": "value", "k2": 10}
17 kết hợp các giá trị có cùng một khóa trong khi
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
8 loại bỏ các giá trị cho tất cả các khóa trùng lặp ngoại trừ phần cuối, như được hiển thị ở đây:

["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
8

Các giá trị mảng và đối tượng được hợp nhất bằng cách tự động xử lý đối tượng như một mảng và hợp nhất các mảng bằng cách kết hợp các giá trị hoặc bởi khóa trùng lặp cuối cùng sẽ thắng được theo lựa chọn hàm hợp nhất (

{"k1": "value", "k2": 10}
17 hoặc
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
8 :last duplicate key wins according to the choice of merging function (
{"k1": "value", "k2": 10}
17 or
mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
8, respectively), as can be seen in this example:

["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
9

Tìm kiếm và sửa đổi các giá trị JSON

Biểu thức đường dẫn JSON chọn một giá trị trong tài liệu JSON.

Biểu thức đường dẫn rất hữu ích với các chức năng trích xuất các phần hoặc sửa đổi tài liệu JSON, để chỉ định vị trí trong tài liệu đó để vận hành. Ví dụ: truy vấn sau trích xuất từ ​​tài liệu JSON Giá trị của thành viên với khóa

{"k1": "value", "k2": 10}
71:

[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
0

Path Cú pháp sử dụng ký tự

{"k1": "value", "k2": 10}
72 hàng đầu để thể hiện tài liệu JSON đang được xem xét, theo tùy chọn theo các bộ chọn cho thấy các phần cụ thể hơn của tài liệu:

  • Một khoảng thời gian theo sau là tên khóa tên thành viên trong một đối tượng có khóa đã cho. Tên khóa phải được chỉ định trong dấu ngoặc kép nếu tên không có trích dẫn không hợp pháp trong các biểu thức đường dẫn (ví dụ: nếu nó chứa một không gian).

  • [

    {"k1": "value", "k2": 10}
    05] Được thêm vào một
    {"k1": "value", "k2": 10}
    74 chọn một mảng đặt tên cho giá trị tại vị trí
    {"k1": "value", "k2": 10}
    05 trong mảng. Vị trí mảng là số nguyên bắt đầu bằng không. Nếu
    {"k1": "value", "k2": 10}
    74 không chọn giá trị mảng, ________ 174 [0] sẽ đánh giá cùng giá trị với
    {"k1": "value", "k2": 10}
    74:
    appended to a
    {"k1": "value", "k2": 10}
    74 that selects an array names the value at position
    {"k1": "value", "k2": 10}
    05 within the array. Array positions are integers beginning with zero. If
    {"k1": "value", "k2": 10}
    74 does not select an array value,
    {"k1": "value", "k2": 10}
    74[0] evaluates to the same value as
    {"k1": "value", "k2": 10}
    74:

    [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
    {"k1": "value", "k2": [10, 20]}
    1
  • {"k1": "value", "k2": 10}
    79 đến
    {"k1": "value", "k2": 10}
    05] Chỉ định một tập hợp con hoặc phạm vi giá trị mảng bắt đầu bằng giá trị tại vị trí
    {"k1": "value", "k2": 10}
    81 và kết thúc bằng giá trị tại vị trí
    {"k1": "value", "k2": 10}
    05.

    {"k1": "value", "k2": 10}
    83 được hỗ trợ như một từ đồng nghĩa với chỉ mục của phần tử mảng ngoài cùng bên phải. Địa chỉ tương đối của các yếu tố mảng cũng được hỗ trợ. Nếu
    {"k1": "value", "k2": 10}
    74 không chọn giá trị mảng, ________ 174 [Last] đánh giá cùng giá trị với
    {"k1": "value", "k2": 10}
    74, như được hiển thị sau trong phần này (xem phần tử mảng ngoài cùng bên phải).

  • Các đường dẫn có thể chứa

    {"k1": "value", "k2": 10}
    87 hoặc
    {"k1": "value", "k2": 10}
    88 ký tự đại diện:

    • {"k1": "value", "k2": 10}
      89 đánh giá các giá trị của tất cả các thành viên trong một đối tượng JSON.

    • {"k1": "value", "k2": 10}
      90 đánh giá các giá trị của tất cả các phần tử trong mảng JSON.

    • ________ 191 ** ________ 192 Đánh giá tất cả các đường dẫn bắt đầu bằng tiền tố được đặt tên và kết thúc với hậu tố được đặt tên.

  • A path that does not exist in the document (evaluates to nonexistent data) evaluates to

    mysql> SELECT JSON_ARRAY('a', 1, NOW());
    +----------------------------------------+
    | JSON_ARRAY('a', 1, NOW())              |
    +----------------------------------------+
    | ["a", 1, "2015-07-27 09:43:47.000000"] |
    +----------------------------------------+
    8.

Let

{"k1": "value", "k2": 10}
72 refer to this JSON array with three elements:

[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
2

Then:

  • {"k1": "value", "k2": 10}
    95 evaluates to
    {"k1": "value", "k2": 10}
    96.

  • {"k1": "value", "k2": 10}
    97 evaluates to
    {"k1": "value", "k2": 10}
    98.

  • {"k1": "value", "k2": 10}
    99 evaluates to
    ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    00.

  • ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    01 evaluates to
    mysql> SELECT JSON_ARRAY('a', 1, NOW());
    +----------------------------------------+
    | JSON_ARRAY('a', 1, NOW())              |
    +----------------------------------------+
    | ["a", 1, "2015-07-27 09:43:47.000000"] |
    +----------------------------------------+
    8 (it refers to the fourth array element, which does not exist).

Because

{"k1": "value", "k2": 10}
97 and
{"k1": "value", "k2": 10}
99 evaluate to nonscalar values, they can be used as the basis for more-specific path expressions that select nested values. Examples:

  • ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    05 evaluates to
    ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    06.

  • ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    07 evaluates to
    ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    08.

  • ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    09 evaluates to
    ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    10.

  • ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    11 evaluates to
    ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    12.

As mentioned previously, path components that name keys must be quoted if the unquoted key name is not legal in path expressions. Let

{"k1": "value", "k2": 10}
72 refer to this value:

[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
3

The keys both contain a space and must be quoted:

  • ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    14 evaluates to
    ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    15.

  • ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    16 evaluates to
    ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    17.

Paths that use wildcards evaluate to an array that can contain multiple values:

[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
4

In the following example, the path

["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
18 evaluates to multiple paths (
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
19 and
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
20) and produces an array of the matching path values:

[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
5

Ranges from JSON arrays.  You can use ranges with the

["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
21 keyword to specify subsets of JSON arrays. For example,
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
22 includes the second, third, and fourth elements of an array, as shown here:

[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
6

The syntax is

{"k1": "value", "k2": 10}
81 to
{"k1": "value", "k2": 10}
05
, where
{"k1": "value", "k2": 10}
81 and
{"k1": "value", "k2": 10}
05 are, respectively, the first and last indexes of a range of elements from a JSON array.
{"k1": "value", "k2": 10}
05 must be greater than
{"k1": "value", "k2": 10}
81;
{"k1": "value", "k2": 10}
81 must be greater than or equal to 0. Array elements are indexed beginning with 0.

You can use ranges in contexts where wildcards are supported.

Rightmost array element.  The

{"k1": "value", "k2": 10}
83 keyword is supported as a synonym for the index of the last element in an array. Expressions of the form last -
{"k1": "value", "k2": 10}
05
can be used for relative addressing, and within range definitions, like this:

[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
7

If the path is evaluated against a value that is not an array, the result of the evaluation is the same as if the value had been wrapped in a single-element array:

[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
8

You can use

["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
32->
{"k1": "value", "k2": 10}
74 with a JSON column identifier and JSON path expression as a synonym for
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
34,
{"k1": "value", "k2": 10}
74). See Section 12.18.3, “Functions That Search JSON Values”, for more information. See also Indexing a Generated Column to Provide a JSON Column Index.

Some functions take an existing JSON document, modify it in some way, and return the resulting modified document. Path expressions indicate where in the document to make changes. For example, the

mysql> SELECT JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}');
+-----------------------------------------------------+
| JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}') |
+-----------------------------------------------------+
| ["a", 1, {"key": "value"}]                          |
+-----------------------------------------------------+
1 row in set (0.00 sec)
1,
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
37, and
mysql> SELECT JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}');
+-----------------------------------------------------+
| JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}') |
+-----------------------------------------------------+
| ["a", 1, {"key": "value"}]                          |
+-----------------------------------------------------+
1 row in set (0.00 sec)
2 functions each take a JSON document, plus one or more path-value pairs that describe where to modify the document and the values to use. The functions differ in how they handle existing and nonexisting values within the document.

Consider this document:

[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
9

mysql> SELECT JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}');
+-----------------------------------------------------+
| JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}') |
+-----------------------------------------------------+
| ["a", 1, {"key": "value"}]                          |
+-----------------------------------------------------+
1 row in set (0.00 sec)
1 replaces values for paths that exist and adds values for paths that do not exist:.

mysql> CREATE TABLE t1 (jdoc JSON);
Query OK, 0 rows affected (0.20 sec)

mysql> INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO t1 VALUES('[1, 2,');
ERROR 3140 (22032) at line 2: Invalid JSON text:
"Invalid value." at position 6 in value (or column) '[1, 2,'.
0

In this case, the path

["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
40 selects an existing value (
{"k1": "value", "k2": 10}
27), which is replaced with the value following the path argument (
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
42). The path
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
43 does not exist, so the corresponding value (
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
44) is added to the value selected by
{"k1": "value", "k2": 10}
99.

["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
37 adds new values but does not replace existing values:

mysql> CREATE TABLE t1 (jdoc JSON);
Query OK, 0 rows affected (0.20 sec)

mysql> INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO t1 VALUES('[1, 2,');
ERROR 3140 (22032) at line 2: Invalid JSON text:
"Invalid value." at position 6 in value (or column) '[1, 2,'.
1

mysql> SELECT JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}');
+-----------------------------------------------------+
| JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}') |
+-----------------------------------------------------+
| ["a", 1, {"key": "value"}]                          |
+-----------------------------------------------------+
1 row in set (0.00 sec)
2 replaces existing values and ignores new values:

mysql> CREATE TABLE t1 (jdoc JSON);
Query OK, 0 rows affected (0.20 sec)

mysql> INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO t1 VALUES('[1, 2,');
ERROR 3140 (22032) at line 2: Invalid JSON text:
"Invalid value." at position 6 in value (or column) '[1, 2,'.
2

The path-value pairs are evaluated left to right. The document produced by evaluating one pair becomes the new value against which the next pair is evaluated.

mysql> SELECT JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}');
+-----------------------------------------------------+
| JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}') |
+-----------------------------------------------------+
| ["a", 1, {"key": "value"}]                          |
+-----------------------------------------------------+
1 row in set (0.00 sec)
3 takes a JSON document and one or more paths that specify values to be removed from the document. The return value is the original document minus the values selected by paths that exist within the document:

mysql> CREATE TABLE t1 (jdoc JSON);
Query OK, 0 rows affected (0.20 sec)

mysql> INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO t1 VALUES('[1, 2,');
ERROR 3140 (22032) at line 2: Invalid JSON text:
"Invalid value." at position 6 in value (or column) '[1, 2,'.
3

The paths have these effects:

  • {"k1": "value", "k2": 10}
    99 matches
    ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    50 and removes it.

  • The first instance of

    ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    51 matches
    {"k1": "value", "k2": 10}
    28 in the
    ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    53 element and removes it.

  • The second instance of

    ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    51 matches nothing: That element has already been removed, the path no longer exists, and has no effect.

JSON Path Syntax

Many of the JSON functions supported by MySQL and described elsewhere in this Manual (see Section 12.18, “JSON Functions”) require a path expression in order to identify a specific element in a JSON document. A path consists of the path's scope followed by one or more path legs. For paths used in MySQL JSON functions, the scope is always the document being searched or otherwise operated on, represented by a leading

{"k1": "value", "k2": 10}
72 character. Path legs are separated by period characters (
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
56). Cells in arrays are represented by [
{"k1": "value", "k2": 10}
05]
, where
{"k1": "value", "k2": 10}
05 is a non-negative integer. Names of keys must be double-quoted strings or valid ECMAScript identifiers (see Identifier Names and Identifiers, in the ECMAScript Language Specification). Path expressions, like JSON text, should be encoded using the
{"k1": "value", "k2": 10}
10,
{"k1": "value", "k2": 10}
11, or
{"k1": "value", "k2": 10}
07 character set. Other character encodings are implicitly coerced to
{"k1": "value", "k2": 10}
07. The complete syntax is shown here:

mysql> CREATE TABLE t1 (jdoc JSON);
Query OK, 0 rows affected (0.20 sec)

mysql> INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO t1 VALUES('[1, 2,');
ERROR 3140 (22032) at line 2: Invalid JSON text:
"Invalid value." at position 6 in value (or column) '[1, 2,'.
4

Như đã lưu ý trước đây, trong MySQL, phạm vi của đường dẫn luôn là tài liệu được vận hành, được biểu thị là

{"k1": "value", "k2": 10}
72. Bạn có thể sử dụng
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
64 làm từ đồng nghĩa với tài liệu trong biểu thức đường dẫn JSON.

Ghi chú

Một số triển khai hỗ trợ tham chiếu cột cho phạm vi của đường dẫn JSON; MySQL 8.0 không hỗ trợ những điều này.

Các mã thông báo đại diện

{"k1": "value", "k2": 10}
87 và
{"k1": "value", "k2": 10}
88 được sử dụng như sau:

  • ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    67 đại diện cho các giá trị của tất cả các thành viên trong đối tượng.

  • {"k1": "value", "k2": 10}
    90 đại diện cho các giá trị của tất cả các ô trong mảng.

  • ________ 269] ** ________ 192 đại diện cho tất cả các đường dẫn bắt đầu bằng

    ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    71 và kết thúc bằng
    {"k1": "value", "k2": 10}
    92.
    ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    71 là tùy chọn, trong khi
    {"k1": "value", "k2": 10}
    92 là bắt buộc; Nói cách khác, một con đường có thể không kết thúc trong
    {"k1": "value", "k2": 10}
    88.

    Ngoài ra, một đường dẫn có thể không chứa chuỗi

    ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    76.

Đối với các ví dụ về cú pháp đường dẫn, hãy xem các mô tả về các hàm JSON khác nhau lấy đường dẫn làm đối số, chẳng hạn như

["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
77,
mysql> SELECT JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}');
+-----------------------------------------------------+
| JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}') |
+-----------------------------------------------------+
| ["a", 1, {"key": "value"}]                          |
+-----------------------------------------------------+
1 row in set (0.00 sec)
1 và
mysql> SELECT JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}');
+-----------------------------------------------------+
| JSON_MERGE_PRESERVE('["a", 1]', '{"key": "value"}') |
+-----------------------------------------------------+
| ["a", 1, {"key": "value"}]                          |
+-----------------------------------------------------+
1 row in set (0.00 sec)
2. Để biết các ví dụ bao gồm việc sử dụng các ký tự đại diện
{"k1": "value", "k2": 10}
87 và
{"k1": "value", "k2": 10}
88, hãy xem mô tả của hàm
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
82.

MySQL 8.0 cũng hỗ trợ ký hiệu phạm vi cho các tập hợp con của mảng JSON bằng cách sử dụng từ khóa

["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
21 (chẳng hạn như
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
84), cũng như từ khóa
{"k1": "value", "k2": 10}
83 làm từ đồng nghĩa với phần tử ngoài cùng của mảng. Xem tìm kiếm và sửa đổi các giá trị JSON, để biết thêm thông tin và ví dụ.

So sánh và đặt hàng các giá trị JSON

Các giá trị JSON có thể được so sánh bằng cách sử dụng

["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
86,
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
87,
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
88,
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
89,
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
90,
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
91,
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
92 và
["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
93.

Các toán tử và chức năng so sánh sau đây chưa được hỗ trợ với các giá trị JSON:

  • ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    94

  • ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    95

  • ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    96

  • ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    97

Một cách giải quyết cho các toán tử và chức năng so sánh chỉ được liệt kê là chuyển các giá trị JSON vào loại dữ liệu số hoặc chuỗi MySQL gốc để chúng có loại vô hướng không phải là JSON nhất quán.

So sánh các giá trị JSON diễn ra ở hai cấp độ. Mức so sánh đầu tiên dựa trên các loại JSON của các giá trị so sánh. Nếu các loại khác nhau, kết quả so sánh được xác định chỉ bằng loại có ưu tiên cao hơn. Nếu hai giá trị có cùng loại JSON, mức so sánh thứ hai xảy ra bằng cách sử dụng các quy tắc cụ thể loại.

Danh sách sau đây cho thấy các ưu tiên của các loại JSON, từ ưu tiên cao nhất đến thấp nhất. . Bất kỳ giá trị nào có loại JSON được liệt kê trước đó trong danh sách đều so với bất kỳ giá trị nào có loại JSON được liệt kê sau trong danh sách.

mysql> CREATE TABLE t1 (jdoc JSON);
Query OK, 0 rows affected (0.20 sec)

mysql> INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO t1 VALUES('[1, 2,');
ERROR 3140 (22032) at line 2: Invalid JSON text:
"Invalid value." at position 6 in value (or column) '[1, 2,'.
5

Đối với các giá trị JSON có cùng mức độ ưu tiên, các quy tắc so sánh là loại cụ thể:

  • ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    99

    Các byte

    {"k1": "value", "k2": 10}
    05 đầu tiên của hai giá trị được so sánh, trong đó
    {"k1": "value", "k2": 10}
    05 là số byte trong giá trị ngắn hơn. Nếu các byte
    {"k1": "value", "k2": 10}
    05 đầu tiên của hai giá trị là giống hệt nhau, giá trị ngắn hơn được đặt hàng trước giá trị dài hơn.

  • [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
    {"k1": "value", "k2": [10, 20]}
    03

    Các quy tắc tương tự như đối với

    ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    99.

  • [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
    {"k1": "value", "k2": [10, 20]}
    05

    Các quy tắc tương tự như đối với

    ["12:18:29.000000", "2015-07-29", "2015-07-29 12:18:29.000000"]
    99. Các giá trị
    [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
    {"k1": "value", "k2": [10, 20]}
    05 là các giá trị không được phân loại là một trong các loại khác.

  • [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
    {"k1": "value", "k2": [10, 20]}
    08

    Một giá trị đại diện cho một thời điểm sớm hơn được đặt hàng trước một giá trị đại diện cho một thời điểm sau đó. Nếu hai giá trị ban đầu đến từ các loại MySQL

    [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
    {"k1": "value", "k2": [10, 20]}
    08 và
    [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
    {"k1": "value", "k2": [10, 20]}
    10 tương ứng, chúng đều bằng nhau nếu chúng đại diện cho cùng một thời điểm.

  • [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
    {"k1": "value", "k2": [10, 20]}
    11

    Các giá trị thời gian nhỏ hơn được đặt hàng trước giá trị lớn hơn.

  • [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
    {"k1": "value", "k2": [10, 20]}
    12

    Ngày trước được đặt hàng trước ngày gần đây.

  • [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
    {"k1": "value", "k2": [10, 20]}
    13

    Hai mảng JSON bằng nhau nếu chúng có cùng độ dài và giá trị ở các vị trí tương ứng trong các mảng bằng nhau.

    Nếu các mảng không bằng nhau, thứ tự của chúng được xác định bởi các phần tử ở vị trí đầu tiên có sự khác biệt. Mảng có giá trị nhỏ hơn ở vị trí đó được đặt hàng đầu tiên. Nếu tất cả các giá trị của mảng ngắn hơn bằng các giá trị tương ứng trong mảng dài hơn, mảng ngắn hơn được đặt hàng trước.

    Thí dụ:

    mysql> CREATE TABLE t1 (jdoc JSON);
    Query OK, 0 rows affected (0.20 sec)
    
    mysql> INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> INSERT INTO t1 VALUES('[1, 2,');
    ERROR 3140 (22032) at line 2: Invalid JSON text:
    "Invalid value." at position 6 in value (or column) '[1, 2,'.
    6
  • [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
    {"k1": "value", "k2": [10, 20]}
    14

    JSON Sai nghĩa đen ít hơn so với nghĩa đen của JSON.

  • [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
    {"k1": "value", "k2": [10, 20]}
    15

    Hai đối tượng JSON bằng nhau nếu chúng có cùng một bộ khóa và mỗi phím có cùng giá trị trong cả hai đối tượng.

    Thí dụ:

    [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
    {"k1": "value", "k2": [10, 20]}
    14

    JSON Sai nghĩa đen ít hơn so với nghĩa đen của JSON.

  • [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
    {"k1": "value", "k2": [10, 20]}
    15

    Hai đối tượng JSON bằng nhau nếu chúng có cùng một bộ khóa và mỗi phím có cùng giá trị trong cả hai đối tượng.

    Thí dụ:

    mysql> CREATE TABLE t1 (jdoc JSON);
    Query OK, 0 rows affected (0.20 sec)
    
    mysql> INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> INSERT INTO t1 VALUES('[1, 2,');
    ERROR 3140 (22032) at line 2: Invalid JSON text:
    "Invalid value." at position 6 in value (or column) '[1, 2,'.
    8

    Thứ tự này tương đương với thứ tự các chuỗi SQL với đối chiếu

    {"k1": "value", "k2": 10}
    08. Bởi vì
    {"k1": "value", "k2": 10}
    08 là một đối chiếu nhị phân, so sánh các giá trị JSON nhạy cảm với trường hợp:

    mysql> CREATE TABLE t1 (jdoc JSON);
    Query OK, 0 rows affected (0.20 sec)
    
    mysql> INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> INSERT INTO t1 VALUES('[1, 2,');
    ERROR 3140 (22032) at line 2: Invalid JSON text:
    "Invalid value." at position 6 in value (or column) '[1, 2,'.
    9
  • [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
    {"k1": "value", "k2": [10, 20]}
    23,
    [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
    {"k1": "value", "k2": [10, 20]}
    24

    Các giá trị JSON có thể chứa các số giá trị chính xác và số giá trị xấp xỉ. Để thảo luận chung về các loại số này, xem Phần & NBSP; 9.1.2, chữ số chữ số.

    Các quy tắc để so sánh các loại số MySQL gốc được thảo luận trong Phần & NBSP; 12.3, Chuyển đổi loại trong đánh giá biểu thức, nhưng các quy tắc để so sánh các số trong các giá trị JSON khác nhau phần nào:

    • Trong một so sánh giữa hai cột sử dụng MySQL

      [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
      {"k1": "value", "k2": [10, 20]}
      25 và
      [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
      {"k1": "value", "k2": [10, 20]}
      24 bản địa, người ta biết rằng tất cả các so sánh liên quan đến một số nguyên và gấp đôi, do đó, số nguyên được chuyển đổi thành gấp đôi cho tất cả các hàng. Đó là, các số giá trị chính xác được chuyển đổi thành số giá trị xấp xỉ.

    • Mặt khác, nếu truy vấn so sánh hai cột JSON chứa số, thì không thể biết trước liệu các số có số nguyên hay gấp đôi. Để cung cấp hành vi nhất quán nhất trên tất cả các hàng, MySQL chuyển đổi số giá trị xấp xỉ thành các số giá trị chính xác. Thứ tự kết quả là nhất quán và không mất độ chính xác cho các số giá trị chính xác. Ví dụ, với vô hướng 9223372036854775805, 9223372036854775806, 9223372036854775807 và 9.223372036854776e18

      mysql> SELECT JSON_TYPE('["a", "b", 1]');
      +----------------------------+
      | JSON_TYPE('["a", "b", 1]') |
      +----------------------------+
      | ARRAY                      |
      +----------------------------+
      
      mysql> SELECT JSON_TYPE('"hello"');
      +----------------------+
      | JSON_TYPE('"hello"') |
      +----------------------+
      | STRING               |
      +----------------------+
      
      mysql> SELECT JSON_TYPE('hello');
      ERROR 3146 (22032): Invalid data type for JSON data in argument 1
      to function json_type; a JSON string or JSON type is required.
      0

    Là so sánh JSON để sử dụng các quy tắc so sánh số không phải là json, có thể xảy ra thứ tự không nhất quán. Các quy tắc so sánh MySQL thông thường cho các số mang lại thứ tự sau:

    • So sánh số nguyên:

      mysql> SELECT JSON_TYPE('["a", "b", 1]');
      +----------------------------+
      | JSON_TYPE('["a", "b", 1]') |
      +----------------------------+
      | ARRAY                      |
      +----------------------------+
      
      mysql> SELECT JSON_TYPE('"hello"');
      +----------------------+
      | JSON_TYPE('"hello"') |
      +----------------------+
      | STRING               |
      +----------------------+
      
      mysql> SELECT JSON_TYPE('hello');
      ERROR 3146 (22032): Invalid data type for JSON data in argument 1
      to function json_type; a JSON string or JSON type is required.
      1

      (không được xác định cho 9.223372036854776E18)

    • So sánh kép:

      mysql> SELECT JSON_TYPE('["a", "b", 1]');
      +----------------------------+
      | JSON_TYPE('["a", "b", 1]') |
      +----------------------------+
      | ARRAY                      |
      +----------------------------+
      
      mysql> SELECT JSON_TYPE('"hello"');
      +----------------------+
      | JSON_TYPE('"hello"') |
      +----------------------+
      | STRING               |
      +----------------------+
      
      mysql> SELECT JSON_TYPE('hello');
      ERROR 3146 (22032): Invalid data type for JSON data in argument 1
      to function json_type; a JSON string or JSON type is required.
      2

Để so sánh bất kỳ giá trị JSON nào với SQL

mysql> SELECT JSON_ARRAY('a', 1, NOW());
+----------------------------------------+
| JSON_ARRAY('a', 1, NOW())              |
+----------------------------------------+
| ["a", 1, "2015-07-27 09:43:47.000000"] |
+----------------------------------------+
8, kết quả là
[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
28.

Để so sánh các giá trị JSON và không phải là JSON, giá trị không phải là JSON được chuyển đổi thành JSON theo các quy tắc trong bảng sau, sau đó các giá trị được so sánh như được mô tả trước đây.

Chuyển đổi giữa các giá trị JSON và không json

Bảng sau đây cung cấp một bản tóm tắt các quy tắc mà MySQL tuân theo khi sử dụng giữa các giá trị JSON và các giá trị của các loại khác:

Bảng & NBSP; 11.3 & NBSP; Quy tắc chuyển đổi JSON

loại khácDiễn viên (loại khác là json)Diễn viên (json là loại khác)
JsonKhông thay đổiKhông thay đổi
Loại ký tự UTF8 (
{"k1": "value", "k2": 10}
07,
{"k1": "value", "k2": 10}
11,
{"k1": "value", "k2": 10}
10)
Chuỗi được phân tích cú pháp vào giá trị JSON.Giá trị JSON được tuần tự hóa thành chuỗi
{"k1": "value", "k2": 10}
07.
Các loại nhân vật khácCác mã hóa ký tự khác được chuyển đổi hoàn toàn thành
{"k1": "value", "k2": 10}
07 và được xử lý như mô tả cho loại ký tự này.
Giá trị JSON được tuần tự hóa thành chuỗi
{"k1": "value", "k2": 10}
07, sau đó chuyển sang mã hóa ký tự khác. Kết quả có thể không có ý nghĩa.
mysql> SELECT JSON_ARRAY('a', 1, NOW());
+----------------------------------------+
| JSON_ARRAY('a', 1, NOW())              |
+----------------------------------------+
| ["a", 1, "2015-07-27 09:43:47.000000"] |
+----------------------------------------+
8
Kết quả trong giá trị
mysql> SELECT JSON_ARRAY('a', 1, NOW());
+----------------------------------------+
| JSON_ARRAY('a', 1, NOW())              |
+----------------------------------------+
| ["a", 1, "2015-07-27 09:43:47.000000"] |
+----------------------------------------+
8 của loại JSON.
Không áp dụng.
Các loại hình họcGiá trị hình học được chuyển đổi thành tài liệu JSON bằng cách gọi
[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
37.
Hoạt động bất hợp pháp. Giải pháp thay thế: Chuyển kết quả của Cast (____ 103 là char) cho
[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
39.CAST(
{"k1": "value", "k2": 10}
03 AS CHAR)
to
[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
39.
Tất cả các loại khácKết quả trong một tài liệu JSON bao gồm một giá trị vô hướng duy nhất.Thành công nếu tài liệu JSON bao gồm một giá trị vô hướng duy nhất của loại mục tiêu và giá trị vô hướng đó có thể được chuyển theo loại đích. Nếu không, trả lại
mysql> SELECT JSON_ARRAY('a', 1, NOW());
+----------------------------------------+
| JSON_ARRAY('a', 1, NOW())              |
+----------------------------------------+
| ["a", 1, "2015-07-27 09:43:47.000000"] |
+----------------------------------------+
8 và tạo ra một cảnh báo.

[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
41 và
[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
42 cho các giá trị JSON hoạt động theo các nguyên tắc này:

  • Đặt hàng các giá trị vô hướng JSON sử dụng các quy tắc tương tự như trong cuộc thảo luận trước đó.

  • Đối với các loại tăng dần, các đơn đặt hàng SQL

    mysql> SELECT JSON_ARRAY('a', 1, NOW());
    +----------------------------------------+
    | JSON_ARRAY('a', 1, NOW())              |
    +----------------------------------------+
    | ["a", 1, "2015-07-27 09:43:47.000000"] |
    +----------------------------------------+
    8 trước tất cả các giá trị JSON, bao gồm cả JSON NULL theo nghĩa đen; Đối với các loại giảm dần, các đơn đặt hàng SQL
    mysql> SELECT JSON_ARRAY('a', 1, NOW());
    +----------------------------------------+
    | JSON_ARRAY('a', 1, NOW())              |
    +----------------------------------------+
    | ["a", 1, "2015-07-27 09:43:47.000000"] |
    +----------------------------------------+
    8 sau tất cả các giá trị JSON, bao gồm cả JSON NULL theo nghĩa đen.

  • Các khóa sắp xếp cho các giá trị JSON được ràng buộc bởi giá trị của biến hệ thống

    [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
    {"k1": "value", "k2": [10, 20]}
    45, do đó các khóa chỉ khác nhau sau khi các byte
    [99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
    {"k1": "value", "k2": [10, 20]}
    45 đầu tiên so sánh bằng nhau.

  • Việc sắp xếp các giá trị không phải là hiện tại không được hỗ trợ và cảnh báo xảy ra.

Để phân loại, có thể có lợi khi đúc một vô hướng JSON cho một số loại MySQL bản địa khác. Ví dụ: nếu một cột có tên

[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
47 chứa các đối tượng JSON có thành viên bao gồm khóa
[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
48 và giá trị không âm, hãy sử dụng biểu thức này để sắp xếp các giá trị
[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
48:

mysql> SELECT JSON_TYPE('["a", "b", 1]');
+----------------------------+
| JSON_TYPE('["a", "b", 1]') |
+----------------------------+
| ARRAY                      |
+----------------------------+

mysql> SELECT JSON_TYPE('"hello"');
+----------------------+
| JSON_TYPE('"hello"') |
+----------------------+
| STRING               |
+----------------------+

mysql> SELECT JSON_TYPE('hello');
ERROR 3146 (22032): Invalid data type for JSON data in argument 1
to function json_type; a JSON string or JSON type is required.
3

Nếu có một cột được tạo được xác định để sử dụng biểu thức tương tự như trong

[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
41, trình tối ưu hóa MySQL sẽ nhận ra điều đó và xem xét sử dụng chỉ mục cho kế hoạch thực thi truy vấn. Xem Phần & NBSP; 8.3.11, Trình tối ưu hóa sử dụng các chỉ mục cột được tạo ra.

Tổng hợp các giá trị JSON

Để tổng hợp các giá trị JSON, các giá trị SQL

mysql> SELECT JSON_ARRAY('a', 1, NOW());
+----------------------------------------+
| JSON_ARRAY('a', 1, NOW())              |
+----------------------------------------+
| ["a", 1, "2015-07-27 09:43:47.000000"] |
+----------------------------------------+
8 bị bỏ qua như đối với các loại dữ liệu khác. Các giá trị không-____ 68 được chuyển đổi thành loại số và tổng hợp, ngoại trừ
[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
53,
[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
54 và
[99, {"id": "HK500", "cost": 75.99}, ["hot", "cold"]]
{"k1": "value", "k2": [10, 20]}
55. Việc chuyển đổi thành số sẽ tạo ra một kết quả có ý nghĩa cho các giá trị JSON là vô hướng số, mặc dù (tùy thuộc vào giá trị) cắt và mất độ chính xác có thể xảy ra. Chuyển đổi sang số lượng các giá trị JSON khác có thể không tạo ra kết quả có ý nghĩa.