MySQL中的JSON類型


前言(廢話)

昨天抽了點時間在網上搜列了一個開源項目,項目挺完整的,前后台分離還帶有微信小程序,我Clone下代碼,經過一番倒騰,嘿~還真就跑起來了。在這個過程中,體驗了一把VUE項目工程細節,因為之前沒有接觸過這一塊,所以還是花費了點時間,好在開源項目的QQ群里樓主幫忙看了一下,才得以順利往后進行。后來也有很多網友向樓主提問,也拋出了一些問題,其中有個問題到引起了我的注意。

有個小伙伴執行SQL的時候報錯了,以為項目中給的SQL腳本不全,但是在群里他並沒有給出報錯細節的截圖,樓主后來也就提示了他一句MySQL版本需要在5.7以上,但是后面就沒有更多消息了。

今天早上我還在上班路上,群里的小伙伴就私信我,說能否幫他看下數據庫的問題。等我到了公司再回復他的時候,他告訴我說數據庫問題已經解決了,我追問了一下細節,原來是開源項目中的數據庫建表語句中包含JSON類型字段,導致了他批量執行SQL腳本不成功。其實這樣的問題,在執行腳本的時候遇到錯誤是有日志的,詳細看下日志應該明了。

我其實是沒有注意到這個細節的,因為我前天安裝的數據庫就直接上了8.0,屏蔽了這個問題,但是,MySQL數據庫現在支持JSON類型,挺新奇的,因為之前沒有用過,並不熟悉,所以這一次,讓我逮到個了解它的機會。

關於MySQL的JSON類型

JSON估計大家伙都熟悉了,我就不再介紹這方面內容。其實在MySQL數據庫中,也直到5.7這個版本,才開始引入JSON數據類型,在此之前如果想在表中保存JSON格式類型的數據,則需要依靠varchar或者text之類的數據類型,如果在低於5.7版本的數據庫中使用了JSON類型來建表,顯然是不會成功的。

(截圖為MySQL官網文檔)

如何使用JSON類型

建表

在MySQL中創建具有JSON數據列的表,其實和數據類型沒有太大區別,具體舉例如下:

1 CREATE TABLE tab_base_info (
2     id BIGINT NOT NULL PRIMARY KEY auto_increment,
3     content json
4 );

新增數據

插入一條語句,注意看JSON數據列的內容:

1 INSERT INTO tab_base_info (content)
2 VALUES
3 (
4     '{"author": "Captain&D", "blog": "https://www.cnblogs.com/captainad"}'
5 );

這里需要提醒的是:

  • JSON列存儲的數據要么是NULL,要么必須是JSON格式數據,否則會報錯。
  • JSON數據類型是沒有默認值的(聲明時"DEFAULT NULL")。

JSON數據類型意義

其實,沒有JSON數據類型的支持,我們一樣可以通過varchar類型或者text等類型來保存這一格式的數據,但是,為什么還要專門增加這一數據格式的支持呢?其中肯定有較varchar或者text來存儲此類型更優越的地方。

  • 保證了JSON數據類型的強校驗,JSON數據列會自動校驗存入此列的內容是否符合JSON格式,非正常格式則報錯,而varchar類型和text等類型本身是不存在這種機制的。
  • MySQL同時提供了一組操作JSON類型數據的內置函數
  • 更優化的存儲格式,存儲在JSON列中的JSON數據會被轉成內部特定的存儲格式,允許快速讀取
  • 可以基於JSON格式的特征支持修改特定的鍵值。(即不需要把整條內容拿出來放到程序中遍歷然后尋找替換再塞回去,MySQL內置的函數允許你通過一條SQL語句就能搞定)

MySQL關於JSON的內置函數

MySQL關於JSON數據格式的操作提供了很多高效率的內置函數,我們可以從MySQL官網上找到很詳細的介紹和使用說明,下面貼一張JSON函數的指南:

(截圖為MySQL官方文檔)

其實我們從JSON功能介紹的主頁也可以看到,這些內置函數支持我們創建、查找、替換和返回值等相關的操作,像我們替換指定內容的操作就可以使用JSON_REPLACE()這個函數,不過最后實現通過純SQL語句執行最終的內容替換,你還需要通過執行UPDATE語句,比如:

1 UPDATE tab_base_info 
2 SET content = json_replace(content, '$.author', "tom") 
3 WHERE id = 1;

其中“$.***”表示找到JSON內容中匹配的修改字段。

更多關於這些內置函數的用法,大家都可以到官網(鏈接請查看本文參考資料)的文檔上去查閱,寫的十分詳細而且還有舉例。

參考資料:

1、https://zhuanlan.zhihu.com/p/31823258

2、https://dev.mysql.com/doc/refman/5.7/en/json-functions.html


免責聲明!

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



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