欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

一、問題背景

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

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

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

二、MySQL JSON 函數(shù)

MySQL 5.7+ 版本提供了豐富的 JSON 處理函數(shù),即使數(shù)據(jù)類型是 VARCHAR,只要內容是有效的 JSON,我們仍然可以使用這些函數(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 對象
  • JSON_ARRAY(val[, val]...): 創(chuàng)建 JSON 數(shù)組
  • JSON_VALID(json_doc): 驗證字符串是否為有效的 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 查詢多個 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 查詢特定權限的記錄

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

四、避免常見錯誤

4.1 空值處理

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

-- 錯誤做法
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 的第二個參數(shù)結構與目標 JSON 中的結構匹配:

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

4.3 確保 JSON 有效性

添加 JSON_VALID 檢查確保字段內容是有效的 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 中的應用

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ù)權限過濾
queryWrapper.apply("JSON_CONTAINS(app_ids, JSON_OBJECT('id', {0}, 'hasPermission', {1}))", 
                   "1905555466980773889", true);

5.3 查詢多個 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 內容創(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);

定期維護:對于大表,定期 OPTIMIZE TABLE 有助于維護性能。

七、總結

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

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

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

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

相關文章

  • mysql distinct去重,IFNULL空值處理方式

    mysql distinct去重,IFNULL空值處理方式

    文章介紹了如何在MySQL中使用`DISTINCT`命令去重和使用`IFNULL`函數(shù)處理空值,首先,通過Navicat新建數(shù)據(jù)庫并準備數(shù)據(jù),然后展示了如何使用`DISTINCT`命令去除重復數(shù)據(jù)和使用`IFNULL`函數(shù)將空值替換為“暫無”
    2025-01-01
  • 5招帶你輕松優(yōu)化MySQL count(*)查詢性能

    5招帶你輕松優(yōu)化MySQL count(*)查詢性能

    最近在公司優(yōu)化了幾個慢查詢接口的性能,總結了一些心得體會拿出來跟大家一起分享一下,文中的示例代碼講解詳細,希望對大家會有所幫助
    2022-11-11
  • SQL處理時間戳時如何解決時區(qū)問題實例詳解

    SQL處理時間戳時如何解決時區(qū)問題實例詳解

    時間戳時間不分東西南北、在地球的每一個角落都是相同的,下面這篇文章主要給大家介紹了關于SQL處理時間戳時如何解決時區(qū)問題的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • mysql函數(shù)split功能實現(xiàn)

    mysql函數(shù)split功能實現(xiàn)

    mysql 5.* 的版本現(xiàn)在沒有split 函數(shù),但有些地方會用,在這里就簡單記錄一下
    2012-09-09
  • mysql基礎架構教程之查詢語句執(zhí)行的流程詳解

    mysql基礎架構教程之查詢語句執(zhí)行的流程詳解

    這篇文章主要給大家介紹了關于mysql基礎架構教程之查詢語句執(zhí)行流程的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧
    2018-11-11
  • 一文了解MYSQL三大范式和表約束

    一文了解MYSQL三大范式和表約束

    范式是"符合某一種級別的關系模式的集合,表示一個關系內部各屬性之間的聯(lián)系的合理化程度",下面這篇文章主要給大家介紹了關于MYSQL三大范式和表約束的相關資料,需要的朋友可以參考下
    2022-04-04
  • Mysql中的幾種常見日志小結

    Mysql中的幾種常見日志小結

    本文主要介紹了Mysql中的幾種常見日志小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-08-08
  • CentOS系統(tǒng)中MySQL5.1升級至5.5.36

    CentOS系統(tǒng)中MySQL5.1升級至5.5.36

    有相關測試數(shù)據(jù)說明從5.1到5.5+,MySQL性能會有明顯的提升,具體的需要自己建立測試環(huán)境去實踐下,今天我們就來操作下,并記錄下來升級的具體步驟
    2017-07-07
  • MySql索引原理和SQL優(yōu)化方式

    MySql索引原理和SQL優(yōu)化方式

    索引是提升數(shù)據(jù)庫查詢效率的有序存儲結構,包括主鍵索引、唯一索引、普通索引等,約束則用于數(shù)據(jù)完整性,包含主鍵、唯一、外鍵等約束,B+樹是常用的索引結構,減少磁盤IO次數(shù),索引應用場景包括where、groupby、orderby
    2024-09-09
  • 詳解MySQL中SlowLog的配置方法(圖文)

    詳解MySQL中SlowLog的配置方法(圖文)

    mysql 日志系統(tǒng)上線有段時間了,前端在慢慢切站點過來寫入,未雨綢繆 diy了套 mysql 監(jiān)控工具
    2014-02-02

最新評論