最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL 中查詢 VARCHAR 類型 JSON 數(shù)據(jù)的問題記錄

 更新時(shí)間:2025年04月14日 10:08:32   作者:yzhSWJ  
在數(shù)據(jù)庫設(shè)計(jì)中,有時(shí)我們會(huì)將 JSON 數(shù)據(jù)存儲(chǔ)在 VARCHAR 或 TEXT 類型字段中,本文將詳細(xì)介紹如何在 MySQL 中有效查詢存儲(chǔ)為 VARCHAR 類型的 JSON 數(shù)據(jù),感興趣的朋友一起看看吧

在數(shù)據(jù)庫設(shè)計(jì)中,有時(shí)我們會(huì)將 JSON 數(shù)據(jù)存儲(chǔ)在 VARCHAR 或 TEXT 類型字段中。這種方式雖然靈活,但在查詢時(shí)需要特別注意。本文將詳細(xì)介紹如何在 MySQL 中有效查詢存儲(chǔ)為 VARCHAR 類型的 JSON 數(shù)據(jù)。

一、問題背景

當(dāng) JSON 數(shù)據(jù)存儲(chǔ)在 VARCHAR 列中時(shí),常見的數(shù)據(jù)格式如下:

[
  {"id":"1905555466980773889","hasPermission":true},
  {"id":"1905547884060835841","hasPermission":false}
]

我們需要查詢這個(gè) JSON 數(shù)組中是否包含特定 ID 的對(duì)象。

二、MySQL JSON 函數(shù)

MySQL 5.7+ 版本提供了豐富的 JSON 處理函數(shù),即使數(shù)據(jù)類型是 VARCHAR,只要內(nèi)容是有效的 JSON,我們?nèi)匀豢梢允褂眠@些函數(shù):

2.1 常用 JSON 函數(shù)

  • JSON_CONTAINS(target, candidate[, path]): 檢查 JSON 文檔是否包含特定值
  • JSON_EXTRACT(json_doc, path): 從 JSON 文檔中提取值
  • JSON_OBJECT(key, val[, key, val]...): 創(chuàng)建 JSON 對(duì)象
  • JSON_ARRAY(val[, val]...): 創(chuàng)建 JSON 數(shù)組
  • JSON_VALID(json_doc): 驗(yàn)證字符串是否為有效的 JSON

三、查詢示例

3.1 基本查詢

查詢 JSON 數(shù)組中包含特定 ID 的記錄:

SELECT * FROM sys_user
WHERE 
  app_ids IS NOT NULL
  AND app_ids != ''
  AND JSON_CONTAINS(app_ids, JSON_OBJECT('id', '1905555466980773889'));

3.2 查詢多個(gè) ID

SELECT * FROM sys_user
WHERE 
  app_ids IS NOT NULL
  AND app_ids != ''
  AND (
    JSON_CONTAINS(app_ids, JSON_OBJECT('id', '1905555466980773889'))
    OR JSON_CONTAINS(app_ids, JSON_OBJECT('id', '1905547884060835841'))
  );

3.3 使用 JSON_OVERLAPS (MySQL 8.0+)

SELECT * FROM sys_user
WHERE 
  app_ids IS NOT NULL
  AND app_ids != ''
  AND JSON_OVERLAPS(
    app_ids, 
    JSON_ARRAY(
      JSON_OBJECT('id', '1905555466980773889'),
      JSON_OBJECT('id', '1905547884060835841')
    )
  );

3.4 查詢特定權(quán)限的記錄

SELECT * FROM sys_user
WHERE 
  app_ids IS NOT NULL
  AND app_ids != ''
  AND JSON_CONTAINS(
    app_ids, 
    JSON_OBJECT('id', '1905555466980773889', 'hasPermission', true)
  );

四、避免常見錯(cuò)誤

4.1 空值處理

JSON_CONTAINS 函數(shù)在處理 NULL 或空字符串時(shí)會(huì)報(bào)錯(cuò),所以需要先排除這些情況:

-- 錯(cuò)誤做法
SELECT * FROM sys_user WHERE JSON_CONTAINS(app_ids, JSON_OBJECT('id', '123'));
-- 正確做法
SELECT * FROM sys_user 
WHERE 
  app_ids IS NOT NULL 
  AND app_ids != '' 
  AND JSON_CONTAINS(app_ids, JSON_OBJECT('id', '123'));

4.2 JSON 格式匹配

確保 JSON_CONTAINS 的第二個(gè)參數(shù)結(jié)構(gòu)與目標(biāo) JSON 中的結(jié)構(gòu)匹配:

-- 錯(cuò)誤做法 (直接傳入 ID 字符串)
SELECT * FROM sys_user WHERE JSON_CONTAINS(app_ids, '"1905555466980773889"');
-- 正確做法 (創(chuàng)建與數(shù)組元素匹配的對(duì)象)
SELECT * FROM sys_user WHERE JSON_CONTAINS(app_ids, JSON_OBJECT('id', '1905555466980773889'));

4.3 確保 JSON 有效性

添加 JSON_VALID 檢查確保字段內(nèi)容是有效的 JSON:

SELECT * FROM sys_user
WHERE 
  app_ids IS NOT NULL
  AND app_ids != ''
  AND JSON_VALID(app_ids) = 1
  AND JSON_CONTAINS(app_ids, JSON_OBJECT('id', '1905555466980773889'));

五、在 MyBatis Plus 中的應(yīng)用

5.1 基本查詢

LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.isNotNull(SysUser::getAppIds)
            .ne(SysUser::getAppIds, "")
            .apply("JSON_CONTAINS(app_ids, JSON_OBJECT('id', {0}))", "1905555466980773889");
List<SysUser> userList = sysUserMapper.selectList(queryWrapper);

5.2 多條件查詢

QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
queryWrapper.isNotNull("app_ids")
            .ne("app_ids", "")
            .apply("JSON_VALID(app_ids) = 1")
            .apply("JSON_CONTAINS(app_ids, JSON_OBJECT('id', {0}))", "1905555466980773889");
// 如果還要根據(jù)權(quán)限過濾
queryWrapper.apply("JSON_CONTAINS(app_ids, JSON_OBJECT('id', {0}, 'hasPermission', {1}))", 
                   "1905555466980773889", true);

5.3 查詢多個(gè) ID

LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.isNotNull(SysUser::getAppIds)
            .ne(SysUser::getAppIds, "")
            .and(w -> w.apply("JSON_CONTAINS(app_ids, JSON_OBJECT('id', {0}))", "1905555466980773889")
                      .or()
                      .apply("JSON_CONTAINS(app_ids, JSON_OBJECT('id', {0}))", "1905547884060835841"));
List<SysUser> userList = sysUserMapper.selectList(queryWrapper);

六、性能優(yōu)化建議

考慮使用 JSON 類型:如果您的 MySQL 版本是 5.7+,考慮使用原生 JSON 類型代替 VARCHAR,這樣可以獲得更好的性能和功能支持。

添加索引:雖然無法直接為 JSON 內(nèi)容創(chuàng)建索引,但可以使用生成的列和函數(shù)索引:

ALTER TABLE sys_user ADD COLUMN app_id_extracted JSON 
  GENERATED ALWAYS AS (JSON_EXTRACT(app_ids, '$[*].id')) VIRTUAL;
ALTER TABLE sys_user ADD INDEX idx_app_id_extracted (app_id_extracted);

定期維護(hù):對(duì)于大表,定期 OPTIMIZE TABLE 有助于維護(hù)性能。

七、總結(jié)

在 MySQL 中查詢 VARCHAR 類型的 JSON 數(shù)據(jù)時(shí),關(guān)鍵是:

  • 使用 JSON_CONTAINS 函數(shù)并構(gòu)造正確的 JSON 結(jié)構(gòu)進(jìn)行匹配
  • 處理好 NULL 和空字符串
  • 驗(yàn)證 JSON 有效性
  • 在 MyBatis Plus 中使用 apply 方法添加原生 SQL 條件

正確使用這些技術(shù)可以有效地查詢和處理 VARCHAR 中存儲(chǔ)的 JSON 數(shù)據(jù)。

到此這篇關(guān)于MySQL 中查詢 VARCHAR 類型 JSON 數(shù)據(jù)的的文章就介紹到這了,更多相關(guān)mysql 查詢 VARCHAR 類型 JSON 數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

清镇市| 措勤县| 白朗县| 西峡县| 九江县| 大竹县| 通辽市| 西平县| 阿勒泰市| 平远县| 江都市| 织金县| 岢岚县| 青浦区| 七台河市| 潍坊市| 南岸区| 青阳县| 双峰县| 鄱阳县| 天台县| 明光市| 信丰县| 潞城市| 阿鲁科尔沁旗| 东乡县| 鞍山市| 五河县| 北京市| 昌都县| 京山县| 雷山县| 乡城县| 鹿邑县| 吴桥县| 六枝特区| 驻马店市| 法库县| 韶山市| 黑河市| 铜山县|