前言(廢話) 昨天抽了點時間在網上搜列了一個開源項目,項目挺完整的,前後臺分離還帶有微信小程式,我Clone下代碼,經過一番倒騰,嘿~還真就跑起來了。在這個過程中,體驗了一把VUE項目工程細節,因為之前沒有接觸過這一塊,所以還是花費了點時間,好在開源項目的QQ群里樓主幫忙看了一下,才得以順利往後進行 ...
前言(廢話)
昨天抽了點時間在網上搜列了一個開源項目,項目挺完整的,前後臺分離還帶有微信小程式,我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