溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

MySQL中JSON字段數(shù)據(jù)類(lèi)型怎么用

發(fā)布時(shí)間:2022-06-14 15:03:07 來(lái)源:億速云 閱讀:302 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“MySQL中JSON字段數(shù)據(jù)類(lèi)型怎么用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“MySQL中JSON字段數(shù)據(jù)類(lèi)型怎么用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

    前言

    JSON 類(lèi)型是從 MySQL 5.7 版本開(kāi)始支持的功能,MySQL 支持由RFC 7159定義的本機(jī)JSON數(shù)據(jù)類(lèi)型,該類(lèi)型可有效訪問(wèn) JSON(JavaScript 對(duì)象 table 示法)文檔中的數(shù)據(jù)。與將 JSON 格式的字符串存儲(chǔ)在字符串列中相比,JSON數(shù)據(jù)類(lèi)型具有以下優(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類(lèi)型字段可以是JSONObject,也可以是JSONArray類(lèi)型,在 MySQL 中,JSON 值被編寫(xiě)為字符串。 MySQL 會(huì)解析在需要 JSON 值的上下文中使用的任何字符串,如果該字符串作為 JSON 無(wú)效,則會(huì)產(chǎn)生錯(cuò)誤。這些上下文包括將值插入具有JSON數(shù)據(jù)類(lèi)型的列中,以及將參數(shù)傳遞給需要 JSON 值的函數(shù)(在 MySQL JSON 函數(shù)的文檔中通常顯示為* json_doc 或 json_val *)。

    • JSON_TYPE()函數(shù)需要一個(gè) JSON 參數(shù),并嘗試將其解析為 JSON 值。如果有效,則返回值的 JSON 類(lèi)型,否則返回錯(cuò)誤:

    MySQL中JSON字段數(shù)據(jù)類(lèi)型怎么用

    搜索JSON類(lèi)型數(shù)據(jù)

    SELECT * FROM sd_school_faq WHERE faq_similar_question -> '$[*].*' LIKE '%課表在哪里?%';

    MySQL中JSON字段數(shù)據(jù)類(lèi)型怎么用

    • 路徑可以包含***通配符:

    • .[*]求值為 JSON 對(duì)象中所有成員的值。

      • [*]計(jì)算 JSON 數(shù)組中所有元素的值。

      • prefix**suffix計(jì)算所有以命名前綴開(kāi)頭并以命名后綴結(jié)尾的路徑。

    • 文檔中不存在的路徑(評(píng)估為不存在的數(shù)據(jù))評(píng)估為NULL。

    在 JSON 和非 JSON 值之間轉(zhuǎn)換

    下 table 概述了在 JSON 值和其他類(lèi)型的值之間進(jìn)行轉(zhuǎn)換時(shí) MySQL 遵循的規(guī)則:

    table11.3 JSON 轉(zhuǎn)換規(guī)則

    other typeCAST(其他類(lèi)型的 AS JSON)CAST(JSON AS 其他類(lèi)型)
    JSONNo changeNo change
    utf8 字符類(lèi)型(utf8mb4utf8,ascii)該字符串將解析為 JSON 值。JSON 值被序列化為utf8mb4字符串。
    其他字符類(lèi)型其他字符編碼將隱式轉(zhuǎn)換為utf8mb4,并按 utf8 字符類(lèi)型所述進(jìn)行處理。JSON 值被序列化為utf8mb4字符串,然后轉(zhuǎn)換為其他字符編碼。結(jié)果可能沒(méi)有意義。
    NULL結(jié)果為 JSON 類(lèi)型的NULL值。Not applicable.
    Geometry types通過(guò)調(diào)用ST_AsGeoJSON()將幾何值轉(zhuǎn)換為 JSON 文檔。非法操作。解決方法:將CAST(json_val AS CHAR)的結(jié)果傳遞給ST_GeomFromGeoJSON()
    所有其他類(lèi)型結(jié)果是由單個(gè)標(biāo)量值組成的 JSON 文檔。如果 JSON 文檔由目標(biāo)類(lèi)型的單個(gè)標(biāo)量值組成,并且該標(biāo)量值可以轉(zhuǎn)換為目標(biāo)類(lèi)型,則成功。否則,返回NULL并產(chǎn)生警告。

    JSON 值的ORDER BYGROUP BY按照以下原則工作:

    • 標(biāo)量 JSON 值的排序使用與前面的討論相同的規(guī)則。

    • 對(duì)于升序排序,SQL NULL在所有 JSON 值(包括 JSON 空 Literals)之前進(jìn)行排序;對(duì)于降序排序,SQL NULL對(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 類(lèi)型可能是有益的。例如,如果名為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í)別出該列,并考慮將索引用于查詢(xún)執(zhí)行計(jì)劃。

    JSON 值的匯總

    對(duì)于 JSON 值的匯總,與其他數(shù)據(jù)類(lèi)型一樣,將忽略 SQL NULL值。非NULL值將轉(zhuǎn)換為數(shù)字類(lèi)型并進(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é)果。

    讀到這里,這篇“MySQL中JSON字段數(shù)據(jù)類(lèi)型怎么用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI