MySQL中JSON字段數(shù)據(jù)類型詳解
前言
JSON 類型是從 MySQL 5.7 版本開始支持的功能,MySQL 支持由RFC 7159定義的本機(jī)JSON數(shù)據(jù)類型,該類型可有效訪問 JSON(JavaScript 對(duì)象 table 示法)文檔中的數(shù)據(jù)。與將 JSON 格式的字符串存儲(chǔ)在字符串列中相比,JSON數(shù)據(jù)類型具有以下優(yōu)點(diǎn):
- 自動(dòng)驗(yàn)證存儲(chǔ)在JSON列中的 JSON 文檔。無(wú)效的文檔會(huì)產(chǎn)生錯(cuò)誤。
- 優(yōu)化的存儲(chǔ)格式。存儲(chǔ)在JSON列中的 JSON 文檔將轉(zhuǎn)換為內(nèi)部格式,從而可以快速讀取文檔元素。
- JSON列不能具有非NULL的默認(rèn)值。
創(chuàng)建JSON值
JSON類型字段可以是JSONObject,也可以是JSONArray類型,在 MySQL 中,JSON 值被編寫為字符串。 MySQL 會(huì)解析在需要 JSON 值的上下文中使用的任何字符串,如果該字符串作為 JSON 無(wú)效,則會(huì)產(chǎn)生錯(cuò)誤。這些上下文包括將值插入具有JSON數(shù)據(jù)類型的列中,以及將參數(shù)傳遞給需要 JSON 值的函數(shù)(在 MySQL JSON 函數(shù)的文檔中通常顯示為* json_doc 或 json_val *)。
- JSON_TYPE()函數(shù)需要一個(gè) JSON 參數(shù),并嘗試將其解析為 JSON 值。如果有效,則返回值的 JSON 類型,否則返回錯(cuò)誤:

搜索JSON類型數(shù)據(jù)
SELECT * FROM sd_school_faq WHERE faq_similar_question -> '$[*].*' LIKE '%課表在哪里?%';

路徑可以包含
*或**通配符:.[*]求值為 JSON 對(duì)象中所有成員的值。[*]計(jì)算 JSON 數(shù)組中所有元素的值。prefix**suffix計(jì)算所有以命名前綴開頭并以命名后綴結(jié)尾的路徑。
文檔中不存在的路徑(評(píng)估為不存在的數(shù)據(jù))評(píng)估為
NULL。
在 JSON 和非 JSON 值之間轉(zhuǎn)換
下 table 概述了在 JSON 值和其他類型的值之間進(jìn)行轉(zhuǎn)換時(shí) MySQL 遵循的規(guī)則:
table11.3 JSON 轉(zhuǎn)換規(guī)則
| other type | CAST(其他類型的 AS JSON) | CAST(JSON AS 其他類型) |
|---|---|---|
| JSON | No change | No change |
utf8 字符類型(utf8mb4,utf8,ascii) | 該字符串將解析為 JSON 值。 | JSON 值被序列化為utf8mb4字符串。 |
| 其他字符類型 | 其他字符編碼將隱式轉(zhuǎn)換為utf8mb4,并按 utf8 字符類型所述進(jìn)行處理。 | JSON 值被序列化為utf8mb4字符串,然后轉(zhuǎn)換為其他字符編碼。結(jié)果可能沒有意義。 |
NULL | 結(jié)果為 JSON 類型的NULL值。 | Not applicable. |
| Geometry types | 通過調(diào)用ST_AsGeoJSON()將幾何值轉(zhuǎn)換為 JSON 文檔。 | 非法操作。解決方法:將CAST(json_val AS CHAR)的結(jié)果傳遞給ST_GeomFromGeoJSON() |
| 所有其他類型 | 結(jié)果是由單個(gè)標(biāo)量值組成的 JSON 文檔。 | 如果 JSON 文檔由目標(biāo)類型的單個(gè)標(biāo)量值組成,并且該標(biāo)量值可以轉(zhuǎn)換為目標(biāo)類型,則成功。否則,返回NULL并產(chǎn)生警告。 |
JSON 值的ORDER BY和GROUP BY按照以下原則工作:
- 標(biāo)量 JSON 值的排序使用與前面的討論相同的規(guī)則。
- 對(duì)于升序排序,SQL
NULL在所有 JSON 值(包括 JSON 空 Literals)之前進(jìn)行排序;對(duì)于降序排序,SQLNULL對(duì)所有 JSON 值(包括 JSON 空 Literals)進(jìn)行排序。 - JSON 值的排序鍵受
max_sort_length系統(tǒng)變量的值限制,因此僅在前max_sort_length個(gè)字節(jié)之后才不同的鍵比較相等。 - 當(dāng)前不支持對(duì)非標(biāo)量值進(jìn)行排序,并且會(huì)出現(xiàn)警告。
對(duì)于排序,將 JSON 標(biāo)量轉(zhuǎn)換為其他一些本機(jī) MySQL 類型可能是有益的。例如,如果名為jdoc的列包含 JSON 對(duì)象,其成員由id鍵和一個(gè)非負(fù)值組成,則使用此 table 達(dá)式按id值進(jìn)行排序:
ORDER BY CAST(JSON_EXTRACT(jdoc, '$.id') AS UNSIGNED)
如果碰巧有一個(gè)生成的列被定義為使用與ORDER BY中相同的 table 達(dá)式,則 MySQL 優(yōu)化器將識(shí)別出該列,并考慮將索引用于查詢執(zhí)行計(jì)劃。
JSON 值的匯總
對(duì)于 JSON 值的匯總,與其他數(shù)據(jù)類型一樣,將忽略 SQL NULL值。非NULL值將轉(zhuǎn)換為數(shù)字類型并進(jìn)行匯總,但MIN(),MAX()和GROUP_CONCAT()除外。盡管可能會(huì)發(fā)生截?cái)嗪途葥p失,但轉(zhuǎn)換為數(shù)字應(yīng)該為數(shù)字標(biāo)量的 JSON 值產(chǎn)生有意義的結(jié)果。轉(zhuǎn)換為其他 JSON 值的數(shù)量可能不會(huì)產(chǎn)生有意義的結(jié)果。
總結(jié)
到此這篇關(guān)于MySQL中JSON字段數(shù)據(jù)類型的文章就介紹到這了,更多相關(guān)MySQL JSON字段數(shù)據(jù)類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL?JOIN?子句合并多個(gè)表中相關(guān)行全面指南
這篇文章主要為大家介紹了SQL?JOIN?子句合并多個(gè)表中相關(guān)行全面指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
mysql read_buffer_size 設(shè)置多少合適
很多朋友都會(huì)問mysql read_buffer_size 設(shè)置多少合適,其實(shí)這個(gè)都是根據(jù)自己的內(nèi)存大小等來設(shè)置的2016-05-05
mysql server 5.7.20 安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了mysql server 5.7.20 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09
Mysql聯(lián)表update數(shù)據(jù)的示例詳解
這篇文章主要介紹了Mysql聯(lián)表update數(shù)據(jù)的示例詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
MySQL數(shù)據(jù)庫(kù)如何開啟遠(yuǎn)程連接(多備份)
多備份服務(wù)器在備份你的數(shù)據(jù)庫(kù)時(shí),必須能夠遠(yuǎn)程連接上你的數(shù)據(jù)庫(kù)。但是一般來說mysql安裝時(shí)都是關(guān)閉遠(yuǎn)程連接的,因此,需要你開通mysql數(shù)據(jù)庫(kù)的遠(yuǎn)程訪問權(quán)限。那么如何開啟呢2015-01-01
MySQL INSERT INTO SELECT時(shí)自增Id不連續(xù)問題及解決
這篇文章主要介紹了INSERT INTO SELECT時(shí)自增Id不連續(xù)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12

