建表與插入
CREATE TABLE article (
id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
title VARCHAR(200) NOT NULL,
tags JSON DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
INSERT INTO article (title, tags) VALUES ('體驗 MySQL JSON', '["MySQL", "Database"]');
核心查詢函數
| 函數 | 用途 | 示例 |
| JSON_CONTAINS | 判斷文檔是否包含指定值 | WHERE JSON_CONTAINS(tags, '["MySQL"]') |
| JSON_SEARCH | 按模式查找路徑,返回路徑或 NULL | WHERE JSON_SEARCH(tags, 'one', 'Data%') IS NOT NULL |
| JSON_EXTRACT | 按 JSON Path 提取值 | JSON_EXTRACT(doc, '$.name') |
| ->> | 簡寫提取並去引號 | tags->>'$[0]' |
JSON Path 語法
$.key -- 頂層鍵
$.arr[0] -- 數組第 1 元素
$.obj.key -- 嵌套對象
$**.key -- 遞歸搜索所有層級的 key
更新函數
| 函數 | 行為 |
| JSON_SET | 路徑存在則替換,不存在則插入(upsert) |
| JSON_INSERT | 僅插入,路徑存在則忽略 |
| JSON_REPLACE | 僅替換,路徑不存在則忽略 |
| JSON_MERGE | 合併數組/對象(5.7.22+ 建議用 JSON_MERGE_PATCH/PRESERVE) |
| JSON_ARRAY_APPEND | 數組尾部追加 |
| JSON_REMOVE | 刪除指定路徑 |
實戰更新示例
-- 給含 MySQL 標簽且無 dev 的文章加 dev
UPDATE article SET tags = JSON_MERGE(tags, '["dev"]')
WHERE JSON_SEARCH(tags, 'one', 'dev') IS NULL
AND JSON_SEARCH(tags, 'one', 'MySQL') IS NOT NULL;
-- 將第一個標簽改為 "MySQL 5.7.13"
UPDATE article SET tags = JSON_SET(tags, '$[0]', 'MySQL 5.7.13');
總結
MySQL 5.7 原生 JSON 類型提供完整的文檔式操作能力:JSON_CONTAINS/SEARCH/EXTRACT 查詢,SET/INSERT/REPLACE/MERGE/REMOVE 更新,配合 JSON Path 靈活定位,適合半結構化數據場景。