MySQL中存儲json格式數據


1.1.1. JSON類型數據存儲

 新建表

 create table json_user (

 uid int auto_increment,

 data json,

 primary key(uid)

 );

 

插入數據

insert into json_user values (

null, '{

   "name":"lison",

"age":18,

"address":"enjoy"

   }' );

 

 insert into json_user values (

 null,

 '{

  "name":"james",

  "age":28,

  "mail":"james@163.com"

 }');

 

1.1.1.2. JSON函數

1.1.1.2.1. json_extract 抽取

select json_extract('[10, 20, [30, 40]]', '$[1]');

   -- 10

 

 

 

 select

 json_extract(data, '$.name'),

 json_extract(data, '$.address')

 from json_user;

   --取出json類型字段中,name跟address

 

 

1.1.1.2.2. JSON_OBJECT 將對象轉為json

select json_object("name", "enjoy", "email", "enjoy.com", "age",35);

 

insert into json_user values (

 null,

   json_object("name", "王五", "email", "wangwu@qq.com", "age",18) );

 

 

 

 

1.1.1.2.3. json_insert 插入數據

語法:JSON_INSERT(json_doc, path, val[, path, val] ...)

 

 set @json = '{ "a": 1, "b": [2, 3]}';

  -- @json局部   ;    -- @@json全局

 select json_insert(@json, '$.a', 10, '$.c', '[true, false]');

  -- 當前語句:更新或者修改(數據已存在更新,沒有的插入)

 

 update json_user set data = json_insert(data, "$.address_2", "xiangxue") where uid = 1;

 

 

 

1.1.1.2.4. json_merge 合並數據並返回

select json_merge('{"name": "enjoy"}', '{"id": 47}');

 

 select

 json_merge(

    json_extract(data, '$.address'),

    json_extract(data, '$.address_2')

)

 from json_user where uid = 1;

   -- 將當前用戶的兩個地址合並

 

 

 

1.1.1.2.5. 其他函數:

https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html

 

1.1.2. JSON索引

JSON 類型數據本身 無法直接 創建索引,需要將需要索引的 JSON數據 重新 生成虛擬列(Virtual Columns) 之后,對 該列 進行 索引

 

 create table test_inex_1(

  data json,

  gen_col varchar(10) generated always as (json_extract(data, '$.name')),

index idx (gen_col)

 );

 

insert into test_inex_1(data) values ('{"name":"king", "age":18, "address":"cs"}');

insert into test_inex_1(data) values ('{"name":"peter", "age":28, "address":"zz"}');

 

select * from test_inex_1;

 

 

 

疑問:這條sql查詢的結果是?

select json_extract(data,"$.name") as username from test_inex_1 where gen_col="king";

 

select json_extract(data,"$.name") as username from test_inex_1 where gen_col='"king"';

 

 

 

explain select json_extract(data,"$.name") as username from test_index_1 where gen_col="king"

 

 

 

 

查閱官方文檔,建立虛擬列,這個列查詢的時候不需要加上“”符號

create table test_index_2 (

 data json,

 gen_col varchar(10) generated always as (

 json_unquote(

 json_extract(data, "$.name")

 )),

 key idx(gen_col)

 );

 

insert into test_index_2(data) values ('{"name":"king", "age":18, "address":"cs"}');

insert into test_index_2(data) values ('{"name":"peter", "age":28, "address":"zz"}');

 

select json_extract(data,"$.name") as username from test_index_2 where gen_col="king";

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM