色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

MySQL中varchar(n) 中 n 最大取值為多少?

小林coding ? 來源:小林coding ? 作者:小林coding ? 2022-12-05 14:07 ? 次閱讀

大家好,我是小林。

上周發了一篇字節一面:MySQL 的 NULL 值是怎么存放的?,文章里面有提及這個問題:「varchar(n) 中 n 最大取值為多少?」

當時這部分內容寫的不夠嚴謹,所以我重寫了這部分內容。

所以,這次就聊聊這個問題。

前置知識

要回答這個問題,首先我們得先知道 MySQL 存儲一條記錄的格式長什么樣子。

以 Compact 行格式作為例子,它長這樣:

de167c0c-7460-11ed-8abf-dac502259ad0.png

可以看到,一條完整的記錄分為「記錄的額外信息」和「記錄的真實數據」兩個部分。

這里重點講講記錄的額外信息,它包含 3 個部分:變長字段長度列表、NULL 值列表、記錄頭信息。

  • 變長字段長度列表

用于存儲一行記錄中每個變長字段的長度。

「變長字段長度列表」所占用的字節數 = 所有「變長字段長度」占用的字節數之和。

舉個例子,假設數據庫表中有 2 個 varchar(10) 類型的字段,分別為 a 和 b,且數據庫表的字符集為 ascii 字符集(1 個字符占用 1 字節)。

那么a和b字段的數據值的長度分別只需要用1字節表示就行了,因為1字節能表示最大的字節數是 255,而 varchar(10) 類型的字段最大允許存儲的字節數是 10 字節,所以只需要用 1 字節表示變長字段的長度就行。

那么這種情況下的 「變長字段長度列表」所占用的字節數 = 1 字節 + 1字節 = 2 字節。

「變長字段長度列表」不是必須的,如果數據庫表沒有變長字段,比如字段類型都是int,那么行格式中就不需要「變長字段長度列表」。

  • NULL 值列表

用于標記一行記錄中字段值為 NULL 的字段,二進制位的值為 1 時,代表該字段的值為NULL,二進制位的值為 0 時,代表該字段的值不為 NULL。

另外,NULL 值列表必須用整數個字節的位表示(1字節8位),如果使用的二進制位個數不足整數個字節,則在字節的高位補 0

如果表中允許為 NULL 值的記錄的個數小于等于 8 個,那么 NULL 值列表就會用 1 字節表示。

如果如果表中允許為 NULL 值的記錄的個數大于8 并且小于等于 16,那么 NULL 值列表就會用 2 字節表示,以此類推。

因此,如果表中有字段允許為NULL,那么NULL 值列表」至少占用 1 字節空間。

NULL 值列表不是必須的,如果數據庫表中的字段都定義成NOT NULL,那么行格式中就不需要NULL 值列表」。

  • 記錄頭信息

記錄頭信息中包含的內容很多,比如記錄的刪除標記位,指向下一條記錄的指針等等,不是本文問題的重點,所以我就不細講了。

varchar(n) 中 n 最大取值為多少?

我們要清楚一點,MySQL 規定除了 TEXT、BLOBs 這種大對象類型之外,其他所有的列(不包括隱藏列和記錄頭信息)占用的字節長度加起來不能超過 65535 個字節

也就是說,一行記錄除了 TEXT、BLOBs 類型的列,限制最大為 65535 字節,注意是一行的總長度,不是一列

知道了這個前提之后,我們再來看看這個問題:「varchar(n) 中 n 最大取值為多少?」

varchar(n) 字段類型的 n 代表的是最多存儲的字符數量,并不是字節大小哦。

要算 varchar(n) 最大能允許存儲的字節數,還要看數據庫表的字符集,因為字符集代表著,1個字符要占用多少字節。

比如 ascii 字符集, 1 個字符占用 1 字節,那么 varchar(100) 意味著最大能允許存儲 100 字節的數據。

單字段的情況

前面我們知道了,一行記錄最大只能存儲 65535 字節的數據。

那假設數據庫表只有一個 varchar(n) 類型的列且字符集是 ascii,在這種情況下, varchar(n) 中 n 最大取值是 65535 嗎?

不著急說結論,我們先來做個實驗驗證一下。

我們定義一個 varchar(65535) 類型的字段,字符集為 ascii 的數據庫表。

CREATETABLEtest(
`name`VARCHAR(65535)NULL
)ENGINE=InnoDBDEFAULTCHARACTERSET=asciiROW_FORMAT=COMPACT;

看能不能成功創建一張表:

de2baa1e-7460-11ed-8abf-dac502259ad0.png

結果顯示,創建失敗了。

從報錯信息就可以知道一行數據的最大字節數是 65535(不包含 TEXT、BLOBs 這種大對象類型),其中包含了 storage overhead

問題來了,這個 storage overhead 是什么呢?其實就是「變長字段長度列表」和 「NULL 值列表」。

也就是說一行數據的最大字節數 65535,其實是包含「變長字段長度列表」和 「NULL 值列表」所占用的字節數的

所以, 我們在算 varchar(n) 中 n 最大值時,需要減去 storage overhead 占用的字節數。

這是因為我們存儲字段類型為 varchar(n) 的數據時,其實分成了三個部分來存儲:

  • 真實數據
  • 真實數據占用的字節數
  • NULL 標識,如果不允許為NULL,這部分不需要

本次案例中,「NULL 值列表」所占用的字節數是多少?

前面我創建表的時候,字段是允許為 NULL 的,所以會用 1 字節來表示「NULL 值列表」

本次案例中,「變長字段長度列表」所占用的字節數是多少?

「變長字段長度列表」所占用的字節數 = 所有「變長字段長度」占用的字節數之和。

所以,我們要先知道每個變長字段的「變長字段長度」需要用多少字節表示?具體情況分為:

  • 條件一:如果變長字段允許存儲的最大字節數小于等于 255 字節,就會用 1 字節表示「變長字段長度」;
  • 條件二:如果變長字段允許存儲的最大字節數大于 255 字節,就會用 2 字節表示「變長字段長度」;

我們這里字段類型是 varchar(65535) ,字符集是 ascii,所以代表著變長字段允許存儲的最大字節數是 65535,符合條件二,所以會用 2 字節來表示「變長字段長度」。

因為我們這個案例是只有 1 個變長字段,所以「變長字段長度列表」= 1 個「變長字段長度」占用的字節數,也就是 2 字節

因為我們在算 varchar(n) 中 n 最大值時,需要減去 「變長字段長度列表」和 「NULL 值列表」所占用的字節數的。

所以,在數據庫表只有一個 varchar(n) 字段且字符集是 ascii 的情況下,varchar(n) 中 n 最大值 = 65535 - 2 - 1 = 65532

我們先來測試看看 varchar(65533) 是否可行?

de3ec586-7460-11ed-8abf-dac502259ad0.png

可以看到,還是不行,接下來看看 varchar(65532) 是否可行?

de6852e8-7460-11ed-8abf-dac502259ad0.png

可以看到,創建成功了。說明我們的推論是正確的,在算 varchar(n) 中 n 最大值時,需要減去 「變長字段長度列表」和 「NULL 值列表」所占用的字節數的。

當然,我上面這個例子是針對字符集為 ascii 情況,如果采用的是 UTF-8,varchar(n) 最多能存儲的數據計算方式就不一樣了:

  • 在 UTF-8 字符集下,一個字符串最多需要三個字節,varchar(n) 的 n 最大取值就是 65532/3 = 21844。

上面所說的只是針對于一個字段的計算方式。

多字段的情況

如果有多個字段的話,要保證所有字段的長度 + 變長字段字節數列表所占用的字節數 + NULL值列表所占用的字節數 <= 65535

這里舉個多字段的情況的例子。

e05a3850-7460-11ed-8abf-dac502259ad0.png

實驗結果:

e08846c8-7460-11ed-8abf-dac502259ad0.png

總結

varchar(n) 中 n 最大取值為多少?

一行記錄最大能存儲 65535 字節的數據,但是這個是包含「變長字段字節數列表所占用的字節數」和「NULL值列表所占用的字節數」。所以, 我們在算 varchar(n) 中 n 最大值時,需要減去這兩個列表所占用的字節數。

如果一張表只有一個 varchar(n) 字段,且允許為 NULL,字符集為 ascii。varchar(n) 中 n 最大取值為 65532。

計算公式:65535 - 變長字段字節數列表所占用的字節數- NULL值列表所占用的字節數 = 65535 - 2 - 1 = 65532。

如果有多個字段的話,要保證所有字段的長度 + 變長字段字節數列表所占用的字節數 + NULL值列表所占用的字節數 <= 65535。


歷史好文:

字節一面:HTTP 長連接和 TCP 長連接有區別?

美團三面:一直追問我, MySQL 幻讀被徹底解決了嗎?

保姆級教程!2 萬字 + 30 張圖搞懂 MySQL 是怎么加行級鎖的?

MySQL 全局鎖、表級鎖、行級鎖,你搞清楚了嗎?


審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7004

    瀏覽量

    88944
  • MySQL
    +關注

    關注

    1

    文章

    804

    瀏覽量

    26531

原文標題:面試官:MySQL 中 varchar(n) 中 n 最大取值為多少?

文章出處:【微信號:小林coding,微信公眾號:小林coding】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    千視全新固件發布 | N60、N5、N6、E3 實力升級,助力音視頻行業高效創作

    在音視頻行業追求高畫質、低延時、高效率的傳輸制作環境,技術創新始終是驅動進步的核心力量。千視秉承“以用戶中心”的理念,再次從市場痛點出發,用戶提供更優質的解決方案。這一次,我們推出了針對
    的頭像 發表于 12-18 10:02 ?137次閱讀
    千視全新固件發布 | <b class='flag-5'>N</b>60、<b class='flag-5'>N</b>5、<b class='flag-5'>N</b>6、E3 實力升級,助力音視頻行業高效創作

    現代汽車IONIQ 5 N榮獲2025國年度性能車大獎

    在歷經長達3個月的嚴格評選與激烈角逐后,備受矚目的2025國年度車評選活動終于圓滿落下帷幕。現代汽車N品牌旗下IONIQ 5 N(艾尼氪5N)憑借其卓越的綜合性能表現獲得了211分的
    的頭像 發表于 12-11 16:41 ?167次閱讀

    MHMF082L84N-網絡式伺服A6N 設置例 松下

    電子發燒友網你提供Panasonic(Panasonic)MHMF082L84N-網絡式伺服A6N 設置例相關產品參數、數據手冊,更有MHMF082L84N-網絡式伺服A6
    發表于 12-09 18:44
    MHMF082L84<b class='flag-5'>N</b>-網絡式伺服A6<b class='flag-5'>N</b> 設置例 松下

    MHMF082L82N-網絡式伺服A6N 設置例 松下

    電子發燒友網你提供Panasonic(Panasonic)MHMF082L82N-網絡式伺服A6N 設置例相關產品參數、數據手冊,更有MHMF082L82N-網絡式伺服A6
    發表于 12-06 18:53
    MHMF082L82<b class='flag-5'>N</b>-網絡式伺服A6<b class='flag-5'>N</b> 設置例 松下

    MHMF082L74N-MINAS A6N系列 介紹 松下

    電子發燒友網你提供Panasonic(Panasonic)MHMF082L74N-MINAS A6N系列 介紹相關產品參數、數據手冊,更有MHMF082L74N-MINAS A6
    發表于 12-05 18:45
    MHMF082L74<b class='flag-5'>N</b>-MINAS A6<b class='flag-5'>N</b>系列 介紹 松下

    MHMF082L73N-MINAS A6N系列 介紹 松下

    電子發燒友網你提供Panasonic(Panasonic)MHMF082L73N-MINAS A6N系列 介紹相關產品參數、數據手冊,更有MHMF082L73N-MINAS A6
    發表于 12-04 18:58
    MHMF082L73<b class='flag-5'>N</b>-MINAS A6<b class='flag-5'>N</b>系列 介紹 松下

    80211N連不上

    802.11n是一種無線傳輸標準,旨在提供高速無線網絡連接。它通過使用MIMO(多輸入多輸出)技術和更寬的頻帶寬度來提高數據傳輸速率和信號質量。 然而,在使用過程可能會遇到連接問題,這些問題可能由
    發表于 08-24 14:17

    差分運放電路反饋電容如何取值

    如圖示電路紅圈電容C2/C4改如何取值,有沒有哪位能提供詳細的講解資料。謝謝
    發表于 08-20 08:10

    IG902如何上傳數據到MQTT云平臺EMQX ?

    監控-》設備列表右上角操作的“ ”號添加設備。 3)添加變量 2.模擬傳感器數據上傳: 1)使用軟件modbus Slave 2) 添加模擬數據 3)啟動數據發送
    發表于 07-25 07:09

    有關LM3914N和LM3914N-1應用的疑問

    據手冊,LM3914N-1的封裝形式按NS叫法NA18A,LM3914N的封裝形式按NS叫法N
    發表于 04-28 11:36

    許繼電氣WGB-110N120N130N140N150N160N170N七大系列微機保護測控裝置更換

    許繼電氣的WGB-100N系列保護裝置分七大系列,分別是:WGB-110N系列微機線路保護裝置、WGB-120N系列微機高壓柜綜合保護裝置、WGB-130N系列微機廠用變保護裝置、WG
    的頭像 發表于 04-14 11:53 ?727次閱讀

    什么是零線 (N) 和地線 (PE) ?火線L、地線PE、零線N的區別

    在電力系統,零線(N) 和地線 (PE) 是兩種不同的電線,它們在電路扮演著不同的角色。本文將介紹零線和地線的定義、作用以及火線L、地線PE、零線N之間的區別。
    的頭像 發表于 02-17 15:42 ?2.1w次閱讀
    什么是零線 (<b class='flag-5'>N</b>) 和地線 (PE) ?火線L、地線PE、零線<b class='flag-5'>N</b>的區別

    labview 創建mysql 表時 設置時間 怎么在mysql是格式是date 而不是datetime?

    選擇 時間日期 但是在mysql是date而不是datetime類型 ,除了sql語句創建表 ,怎么能實現創建表數據datetime類型
    發表于 02-04 09:46

    電流濾波器N/L/C的含義

    電流濾波器通常用于消除電路的高頻噪聲和波動,以確保電流的穩定和可靠。在電流濾波器,經常會出現N、L、C等標識,它們分別代表著不同的意思。
    的頭像 發表于 12-28 18:10 ?1094次閱讀

    N溝道和P溝道怎么區分

    場效應晶體管(Field Effect Transistor,FET)是一種廣泛應用于電子電路的半導體器件。根據導電溝道的類型,場效應晶體管可以分為N溝道和P溝道兩種類型。本文將對N溝道和P溝道
    的頭像 發表于 12-28 15:47 ?1.2w次閱讀
    <b class='flag-5'>N</b>溝道和P溝道怎么區分
    主站蜘蛛池模板: 国产成人a一在线观看| 国产99久久久国产精品免费看| 成人人观看的免费毛片| 国产精人妻无码一区麻豆| 久久中文字幕无线观看| 色99蜜臀AV无码| 在线不卡中文字幕| 动漫美女搞鸡| 久久青青草视频在线观| 色淫阁色九九| 最新国产三级在线不卡视频| 国产成人精品自线拍| 麻豆高清免费国产一区| 我的好妈妈8高清在线观看WWW | 人妻夜夜爽99麻豆AV| 亚洲国产精品免费线观看视频| 95国产精品人妻无码久| 国产精品久久久久久AV免费不卡 | 色WWW永久免费视频首页| 一受n攻高h全肉np| 国产成人精品免费视频大全办公室| 久久看片网| 新新电影理论中文字幕| 99热这里只有精品视频2| 黄色直接观看| 双性大乳浪受噗呲噗呲h总| 94色94色永久网站| 国产亚洲欧洲日韩在线观看| 欧美阿v在线天堂| 永久免费观看视频| 国产高清视频在线播放www色| 女厕所边摸边吃奶边做爽视频| 亚洲视频一区| 国产精品96久久久久久AV不卡 | 亚洲日韩国产精品乱-久| 高清国语自产拍免费| 免费国产久久啪在线| 亚洲中文字幕手机版| 国产精品免费大片| 青草伊人久久| 97欧美精品大香伊蕉在人线|