• Về tôi
  • Chính sách riêng tư
  • Liên hệ

HoangThuc.com

Website Developer

  • Trang chủ
  • WordPress
    • Plugin wordpress
  • Lập trình
    • Php
  • Thủ thuật máy tính
You are here: Home / MYSQL / Dữ liệu JSON trong MySQL

Dữ liệu JSON trong MySQL

12 January, 2021 by Hoàng Thức Leave a Comment

Bắt đầu từ Mysql 5.7.8, Mysql hỗ trợ kiểu dữ liệu JSON được xác định nghĩa bởi RFC 7159 , cho phép truy cập vào dữ liệu trong các tài liệu JSON (Javascript Notation Object).
Các điểm lợi của việc lưu dữ liệu vào cột dạng JSON:

  • Tự động xác thực các dữ liệu dạng JSON
  • Tối ưu hoá định dạng lưu trữ
  • Các hàm trong SQL hỗ trợ việc thao tác với dữ liệu cột JSON như tạo mới, quản lý hay tìm kiếm
  • Chuẩn hoá, hợp nhất dữ liệu JSON.

Tạo Dữ Liệu JSON

Dữ liệu dạng JSON có 2 dạng phổ biến là Mảng JSON(Array Json) và Đối tượng JSON(Object Json). Mảng Json chứa các giá trị được phân tách với nhau bởi dấu , và được đặt bên trong [ và ] :

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

Đối tượng Json chứa tập hợp các cặp khoá – giá trị (key – value) được phân tách với nhau cũng bởi dấu , và được đặt bên trong { và }:

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

Tuy nhiên với nhiều trường hợp phức tạp, dữ liệu JSON còn có dạng lồng nhau (Nesting):

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

trong mảng JSON chứ đối tượng JSON và ngược lại.

Thay vì tự đặt ra đối tượng JSON, bạn cũng có thể sử dụng JSON_OBJECT chức năng tích hợp.

Các JSON_OBJECT chức năng chấp nhận một danh sách các cặp khóa / giá trị theo hình thức JSON_OBJECT(key1, value1, key2, value2, … key(n), value(n)) và trả về một đối tượng JSON.

/* Let's sell some mobilephones */

INSERT INTO `e_store`.`products`( `name` , `brand_id` , `category_id` , `attributes` )

VALUES( 'Desire' , '2' , '2' ,

JSON_OBJECT( "network" , JSON_ARRAY("GSM" , "CDMA" , "HSPA" , "EVDO") ,

"body" ,

"5.11 x 2.59 x 0.46 inches" ,

"weight" ,

"143 grams" ,

"sim" ,

"Micro-SIM" ) );

Một chức năng khác mà chúng ta có thể sử dụng để tạo các đối tượng JSON là JSON_MERGE hàm.

Các JSON_MERGE chức năng có nhiều đối tượng JSON và tạo ra một, tổng hợp đối tượng duy nhất.

INSERT INTO `e_store`.`products`( `name` , `brand_id` , `category_id` , `attributes` )

VALUES( 'Explorer' , '3' , '3' ,

JSON_MERGE(

'{"sensor_type": "CMOS"}' ,

'{"processor": "Digic DV III"}' ,

'{"scanning_system": "progressive"}' ,

'{"mount_type": "PL"}' ,

'{"monitor_type": "LCD"}'

) );

Thao Tác với Dữ Liệu Cột JSON

  • Hãy tưởng tượng khi bạn muốn lấy một giá trị nào đó trong một cột dữ liệu JSON(ở đây lấy giá trị name):
 SELECT JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name');
+---------------------------------------------------------+
| JSON_EXTRACT('{"id": 14, "name": "Aztalan"}', '$.name') |
+---------------------------------------------------------+
| "Aztalan"                                               |
+---------------------------------------------------------+

Ở đây Mysql cung cấp hàm JSON_EXTRACT() giúp trả về dữ liệu từ một tài liệu JSON. Dữ liệu được trả về dựa theo đường dẫn cung cấp, trong ví dụ trên chúng ta thấy đường dẫn ở đây là $.name.
Tìm hiểu sâu hơn về đường dẫn này nhé: $ là kí tự thể hiện tài liệu JSON đang được xét đến , name chính là tên khoá ta muốn lấy. Tuy nhiên với các dạng dữ liệu JSON thì đường dẫn lại khác nhau.
Với dạng Mảng JSON thì đường dẫn có dạng $[n] còn với Đối tượng JSON là $.key, n là vị trí giá trị chúng ta muốn lấy trong mảng và key là tên khoá của giá trị chúng ta muốn lấy.

 SELECT JSON_EXTRACT('["abc", 14, "Aztalan"]', '$[0]');
+---------------------------------------------------------+
| JSON_EXTRACT('["abc", 14, "Aztalan"]', '$[0]')          |
+---------------------------------------------------------+
| "abc"                                                   |
+---------------------------------------------------------+

Tuy nhiên với trường hợp dữ liệu dạng lồng nhau thì đường dẫn của chúng ta không đơn giản như vậy. Cùng xem ví dụ sau nhé:

[3, {"a": [5, 6], "b": 10}, [99, 100]]

Đây là một mảng JSON vậy nếu chúng ta muốn lấy giá trị 3 trong mảng thì đường dẫn sẽ là $[0] (trong một array vị trí đầu tiên sẽ bắt đầu là 0), nhưng nếu chọn lấy giá trị thứ 2 ta sẽ có một đối tượng JSON {“a”: [5, 6], “b”: 10} vậy nếu bài toán đặt ra là muốn lấy giá trị của khoá b trong đối tượng JSON này thì ta phải có đường dẫn như nào?. Để lấy giá trị của khoá b ta sẽ có đường dẫn là $[1].b. Với tuỳ trường hợp dạng dữ liệu JSON ta sẽ có đường dẫn là $[n].key với dạng mảng lồng object JSON và $.key[n] mới dạng object lồng mảng JSON.

  • Một số hàm phổ biến được Mysql hỗ trợ như JSON_SET, JSON_INSERT, JSON_REPLACE hay JSON_REMOVE.
 SET @j = '["a", {"b": [true, false]}, [10, 20]]';

JSON_SET () thay thế các giá trị cho các đường dẫn tồn tại và thêm các giá trị cho các đường dẫn không tồn tại:

 SELECT JSON_SET(@j, '$[1].b[0]', 1, '$[2][2]', 2);
+--------------------------------------------+
| JSON_SET(@j, '$[1].b[0]', 1, '$[2][2]', 2) |
+--------------------------------------------+
| ["a", {"b": [1, false]}, [10, 20, 2]]      |
+--------------------------------------------+

JSON_INSERT () thêm các giá trị mới nhưng không thay thế các giá trị hiện có:

 SELECT JSON_INSERT(@j, '$[1].b[0]', 1, '$[2][2]', 2);
+-----------------------------------------------+
| JSON_INSERT(@j, '$[1].b[0]', 1, '$[2][2]', 2) |
+-----------------------------------------------+
| ["a", {"b": [true, false]}, [10, 20, 2]]      |
+-----------------------------------------------+

JSON_REPLACE () thay thế các giá trị hiện có và bỏ qua các giá trị mới:

 SELECT JSON_REPLACE(@j, '$[1].b[0]', 1, '$[2][2]', 2);
+------------------------------------------------+
| JSON_REPLACE(@j, '$[1].b[0]', 1, '$[2][2]', 2) |
+------------------------------------------------+
| ["a", {"b": [1, false]}, [10, 20]]             |
+------------------------------------------------+

JSON_REMOVE () lấy một tài liệu JSON và một hoặc nhiều đường dẫn chỉ định các giá trị sẽ bị xóa khỏi tài liệu. Giá trị trả về là tài liệu gốc trừ đi các giá trị được chọn bởi các đường dẫn tồn tại trong tài liệu:

SELECT JSON_REMOVE(@j, '$[2]', '$[1].b[1]', '$[1].b[1]');
+---------------------------------------------------+
| JSON_REMOVE(@j, '$[2]', '$[1].b[1]', '$[1].b[1]') |
+---------------------------------------------------+
| ["a", {"b": [true]}]                              |
+---------------------------------------------------+

Bài viết khác

  • Chuyển thư mục public sang public_html trong Laravel khi deployChuyển thư mục public sang public_html trong Laravel khi deploy
  • Tạo phân trang trong loop wordpressTạo phân trang trong loop wordpress
  • Tại sao nên chọn wordpress ?Tại sao nên chọn wordpress ?
  • Plugin bất động sản wordpressPlugin bất động sản wordpress
  • Wordpress căn bản 2 – Cấu hình wordpressWordPress căn bản 2 – Cấu hình wordpress
  • Wordpress căn bản 1 – hướng dẫn cài đặtWordPress căn bản 1 – hướng dẫn cài đặt
Share

Bình luận

Bình luận

Filed Under: Blog, Lập trình, MYSQL

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Bài viết mới

> 2021/10/11 19:10:10 [INFO] acme: Registering account for admin@X.X.X.X>

  • Dữ liệu JSON trong MySQL
  • Chuyển thư mục public sang public_html trong Laravel khi deploy
  • Fix “Requested icu-uc 50.1 but version of icu-uc is” trên DirectAdmin

FOLLOW ME

  • Facebook
  • Google+
  • Twitter

Danh mục

  • Blog
  • Lập trình
  • Laravel
  • MYSQL
  • Php
  • Thủ thuật máy tính
  • Vps
    • DirectAdmin
  • Wordpress
    • Plugin wordpress
    • Wordpress căn bản
    • Wordpress nâng cao
      • Custom post wordpress

Archives

  • October 2021
  • January 2021
  • December 2020
  • November 2020
  • September 2020
  • August 2020
  • September 2019
  • August 2019
  • July 2019
  • June 2018
  • August 2017
  • July 2017
  • June 2017
  • May 2017
  • March 2017
  • November 2016
  • September 2016
  • July 2016
  • June 2016
  • May 2016
  • April 2016
  • March 2016
  • January 2016
  • December 2015
  • May 2015
  • April 2015
Copyright © 2023 · HoangThuc.com · Genesis Framework