前言,類型必須是json,雖然text也可以,但是很多操作沒法使用,比如查詢,當然了,這種類型還可以存儲數組
類似 varchar,設置 JSON 主要將字段的 type 是 json, 不能設置長度,可以是 NULL 但不能有默認值。
總結
分類 函數 描述
創建json
json_array 創建json數組
json_object 創建json對象
查詢json
json_contains 判斷是否包含某個json值
column->>path json_unquote(column -> path)的簡潔寫法
json_keys 提取json中的鍵值為json數組
json_search 按給定字符串關鍵字搜索json,返回匹配的路徑
修改json
json_array_append 末尾添加數組元素,如果原有值是數值或json對 象,則轉成數組后,再添加元素
json_array_insert 插入數組元素
json_insert 插入值(插入新值,但不替換已經存在的舊值)
json_merge 合並json數組或對象
json_remove 刪除json數據
json_replace 替換值(只替換已經存在的舊值)
json_set 設置值(替換舊值,並插入不存在的新值)
json_unquote 去除json字符串的引號,將值轉成string類型
返回json屬性
json_depth 返回json文檔的最大深度
json_length 返回json文檔的長度
json_type 返回json值得類型
json_valid 判斷是否為合法json文檔
參考
增
就是插入 json 格式的字符串,可以是對象的形式,也可以是數組的形式
INSERT INTO `a_goods` (`type`, `attrs`)
VALUES ('["新品","熱銷",1,"0"]','{"name":"張三","age":20,"strage":"20","data":[1,"0"]}')
MySQL 也有專門的函數 JSON_OBJECT
,JSON_ARRAY
生成 json 格式的數據,但是吧,使用的時候有注意點,盡量之間寫進去吧
//JSON_OBJECT必須是偶數,嵌套時必須搭配JSON_ARRAY
INSERT INTO `a_goods` (`attrs`, `type`)
VALUES (
JSON_OBJECT("name","張三","age",20,"strage","20","data",JSON_ARRAY("新品","熱銷",1,"0")),
JSON_ARRAY("新品","熱銷",1,"0")
)
查詢
一般對應字符串類型的 category->’$.name’ 中還包含着雙引號,這其實並不是想要的結果,可以用 JSON_UNQUOTE 函數將雙引號去掉,從 MySQL 5.7.13 起也可以通過這個操作符 * ->> *這個和 JSON_UNQUOTE 是等價的
查詢json的值,即鍵的值
SELECT attrs->'$.name' as name, JSON_UNQUOTE(attrs->'$.name'), attrs->>'$.name' FROM a_goods
/* SELECT attrs->'$.name' as name, 查詢json數據中的name的值並賦值給name JSON_UNQUOTE(attrs->'$.name'), attrs->>'$.name' FROM a_goods */
json中的where 語句
SELECT * FROM a_goods WHERE type = CAST('["新品","熱銷",1,"0"]' as JSON)
//查詢json是否在數據庫的存在,其實就相當於 `where a=1` 只不過這個a得轉換一下
//CAST函數用於將某種數據類型的表達式顯式轉換為另一種數據類型
SELECT * FROM a_goods WHERE attrs->>'$.age' = '20'
//要特別注意的是,JSON 中的元素搜索是嚴格區分變量類型的,比如說整型和字符串是嚴格區分的,即 “20”和20
SELECT * FROM a_goods WHERE JSON_CONTAINS(attrs, '20', '$.age')
SELECT * FROM a_goods WHERE JSON_CONTAINS(type, '"新品"')
//用JSON_CONTAINS 函數,但和 *column->path *的形式有點相反的是,JSON_CONTAINS 第二個參數是不接受整數的,無論 json 元素是整型還是字符串,否則會出現錯誤
更新
更新數組按以往的更新就行
UPDATE a_goods SET type = '["demo","0",1]'
但如果要更新 JSON 下的元素,MySQL 並不支持 *column->path *的形式,則可能要用到以下幾個函數
JSON_INSERT()
插入新值,但不會覆蓋已經存在的值
UPDATE a_goods SET category = JSON_INSERT(category, '$.name', 'lnmp', '$.url', 'www.lnmp.cn') WHERE id = 1;
JSON_SET()
插入新值,並覆蓋已經存在的值
UPDATE a_goods SET category = JSON_SET(category, '$.host', 'www.lnmp.cn', '$.url', 'http://www.lnmp.cn') WHERE id = 1;
JSON_REPLACE()
只替換存在的值
UPDATE a_goods SET category = JSON_REPLACE(category, '$.name', 'php', '$.url', 'http://www.php.net') WHERE i
JSON_REMOVE()
刪除 JSON 元素
UPDATE a_goods SET category = JSON_REMOVE(category, '$.url', '$.host') WHERE id = 1;