chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

小林coding ? 來源:小林coding ? 作者:小林coding ? 2022-12-05 14:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

大家好,我是小林。

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

當(dāng)時這部分內(nèi)容寫的不夠嚴(yán)謹(jǐn),所以我重寫了這部分內(nèi)容。

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

前置知識

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

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

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

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

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

  • 變長字段長度列表

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

「變長字段長度列表」所占用的字節(jié)數(shù) = 所有「變長字段長度」占用的字節(jié)數(shù)之和。

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

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

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

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

  • NULL 值列表

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

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

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

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

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

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

  • 記錄頭信息

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

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

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

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

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

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

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

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

單字段的情況

前面我們知道了,一行記錄最大只能存儲 65535 字節(jié)的數(shù)據(jù)。

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

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

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

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

看能不能成功創(chuàng)建一張表:

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

結(jié)果顯示,創(chuàng)建失敗了。

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

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

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

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

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

  • 真實數(shù)據(jù)
  • 真實數(shù)據(jù)占用的字節(jié)數(shù)
  • NULL 標(biāo)識,如果不允許為NULL,這部分不需要

本次案例中,「NULL 值列表」所占用的字節(jié)數(shù)是多少?

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

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

「變長字段長度列表」所占用的字節(jié)數(shù) = 所有「變長字段長度」占用的字節(jié)數(shù)之和。

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

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

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

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

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

所以,在數(shù)據(jù)庫表只有一個 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

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

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

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

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

多字段的情況

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

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

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

實驗結(jié)果:

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

總結(jié)

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

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

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

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

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


歷史好文:

字節(jié)一面:HTTP 長連接和 TCP 長連接有區(qū)別?

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

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

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


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7318

    瀏覽量

    94127
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    897

    瀏覽量

    29265

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Onsemi NTMFS3D2N10MD N溝道功率MOSFET深度解析

    在電子設(shè)計領(lǐng)域,MOSFET是不可或缺的關(guān)鍵元件。今天,我們來詳細(xì)探討Onsemi公司的NTMFS3D2N10MD這款N溝道功率MOSFET,看看它在實際應(yīng)用能為我們帶來哪些優(yōu)勢。
    的頭像 發(fā)表于 12-08 16:38 ?466次閱讀
    Onsemi NTMFS3D2<b class='flag-5'>N</b>10MD <b class='flag-5'>N</b>溝道功率MOSFET深度解析

    工業(yè)數(shù)據(jù)臺支持接入MySQL數(shù)據(jù)庫嗎

    工業(yè)數(shù)據(jù)臺完全支持接入MySQL數(shù)據(jù)庫 ,且通過數(shù)據(jù)同步、集成與治理等技術(shù)手段,能夠充分發(fā)揮MySQL在數(shù)據(jù)存儲與事務(wù)處理方面的優(yōu)勢,同時彌補其在數(shù)據(jù)分析與共享能力上的不足,具體分析如下: 技術(shù)
    的頭像 發(fā)表于 12-04 11:23 ?241次閱讀
    工業(yè)數(shù)據(jù)<b class='flag-5'>中</b>臺支持接入<b class='flag-5'>MySQL</b>數(shù)據(jù)庫嗎

    onsemi NVTYS020N08HL N溝道功率MOSFET:特性與應(yīng)用詳解

    作為電子工程師,在設(shè)計過程,選擇合適的功率MOSFET至關(guān)重要。今天就來詳細(xì)介紹onsemi推出的NVTYS020N08HL N溝道功率MOSFET,探討它的特性、參數(shù)以及在實際應(yīng)用
    的頭像 發(fā)表于 12-01 09:34 ?329次閱讀
    onsemi NVTYS020<b class='flag-5'>N</b>08HL <b class='flag-5'>N</b>溝道功率MOSFET:特性與應(yīng)用詳解

    深入解析 onsemi NVHL060N065SC1 N 溝道 MOSFET

    在電子工程師的日常設(shè)計工作,MOSFET 是不可或缺的重要元件。今天,我們就來深入探討 onsemi 推出的 NVHL060N065SC1 N 溝道 MOSFET,看看它有哪些獨特的性能和應(yīng)用特點。
    的頭像 發(fā)表于 12-01 09:28 ?334次閱讀
    深入解析 onsemi NVHL060<b class='flag-5'>N</b>065SC1 <b class='flag-5'>N</b> 溝道 MOSFET

    onsemi NTMFSS0D9N03P8 N溝道功率MOSFET技術(shù)解析與應(yīng)用指南

    安森美NTMFSS0D9N03P8 N溝道MOSFET是一款單源下MOSFET,具有低 ~RDS (on)~ ,可最大限度地降低導(dǎo)通損耗,另外還具有低~QG~ 和電容,可最大限度地降低
    的頭像 發(fā)表于 11-24 15:35 ?217次閱讀
    onsemi NTMFSS0D9<b class='flag-5'>N</b>03P8 <b class='flag-5'>N</b>溝道功率MOSFET技術(shù)解析與應(yīng)用指南

    中科微電ZK60N04NF:N溝槽MOS管的場景適配專家

    在功率半導(dǎo)體的細(xì)分賽道,MOS管的性能參數(shù)直接決定著電路系統(tǒng)的效率與可靠性。ZK60N04NF這款明確標(biāo)注“N溝槽”屬性的MOS管,以60V額定電壓、40A額定電流與DFN5*6封裝的精準(zhǔn)組合
    的頭像 發(fā)表于 11-05 11:24 ?227次閱讀
    中科微電ZK60<b class='flag-5'>N</b>04NF:<b class='flag-5'>N</b>溝槽MOS管<b class='flag-5'>中</b>的場景適配專家

    MOT4913J N+N 增強型 MOSFET 技術(shù)解析:參數(shù)、特性與應(yīng)用場景

    在功率半導(dǎo)體器件領(lǐng)域,N+N增強型MOSFET憑借多單元集成的架構(gòu),在電機驅(qū)動、電動設(shè)備控制等場景展現(xiàn)出獨特優(yōu)勢。本文將針對仁懋電子(MOT)的MOT4913J型號,從參數(shù)、特性到應(yīng)用場景進行深度
    的頭像 發(fā)表于 10-23 10:50 ?317次閱讀
    MOT4913J <b class='flag-5'>N+N</b> 增強型 MOSFET 技術(shù)解析:參數(shù)、特性與應(yīng)用場景

    合科泰N溝道MOSFET HKTD80N03在電動工具的應(yīng)用

    問題會直接決定其從的壽命和使用順暢度。而合科泰針對性推出N溝道MOSFET—— HKTD80N03,這款產(chǎn)品以以大電流、低損耗的特性,電動工具打造高性價比驅(qū)動方案。
    的頭像 發(fā)表于 08-08 16:48 ?2034次閱讀

    網(wǎng)線標(biāo)識n是代表什么線l是代表什么線

    在網(wǎng)線標(biāo)識及電氣領(lǐng)域中,“N”通常代表零線(Neutral Wire),“L”通常代表火線(Live Wire)。以下是具體說明: N(零線) 定義:零線是電氣系統(tǒng)的中性線,負(fù)責(zé)將電流從負(fù)載(如
    的頭像 發(fā)表于 07-29 10:19 ?1.3w次閱讀
    網(wǎng)線標(biāo)識<b class='flag-5'>中</b><b class='flag-5'>n</b>是代表什么線l是代表什么線

    CYW20704數(shù)據(jù)表寫的 VDDC RESET 是否指的是 RST_N?

    你好 IFX, 數(shù)據(jù)表寫的 VDDC RESET 是否指的是 RST_N?
    發(fā)表于 07-07 07:43

    ADuM160N/ADuM161N/ADuM162N/ADuM163N六通道數(shù)字隔離器技術(shù)手冊

    (CMOS)與單芯片空芯變壓器技術(shù)融為一體,具有優(yōu)于光耦合器件和其它集成式耦合器等替代器件的出色性能特征。這些器件的最大傳播延遲13 ns,在5 V下脈沖寬度失真小于4.5 ns。具有嚴(yán)格的4.0 ns(最大值)傳播延遲通道間
    的頭像 發(fā)表于 06-03 15:42 ?1341次閱讀
    ADuM160<b class='flag-5'>N</b>/ADuM161<b class='flag-5'>N</b>/ADuM162<b class='flag-5'>N</b>/ADuM163<b class='flag-5'>N</b>六通道數(shù)字隔離器技術(shù)手冊

    ADuM150N/ADuM151N/ADuM152N可靠的3.0 kV rms五通道數(shù)字隔離器技術(shù)手冊

    (CMOS) 和整體式空芯變壓器技術(shù)于一身,能夠提供比光耦合器及其他集成耦合器更出色的性能特點。在 5 V 運行時,最大傳播延遲 13 ns,脈寬失真低于 4.5 ns。在最大 4.0 ns 時,傳播延遲的信道匹配是緊密的。
    的頭像 發(fā)表于 06-03 14:49 ?1193次閱讀
    ADuM150<b class='flag-5'>N</b>/ADuM151<b class='flag-5'>N</b>/ADuM152<b class='flag-5'>N</b>可靠的3.0 kV rms五通道數(shù)字隔離器技術(shù)手冊

    ADuM250N/ADuM251N/ADuM252N五通道數(shù)字隔離器技術(shù)手冊

    融為一體,具有優(yōu)于光耦合器件和其它集成式耦合器等替代器件的出色性能特征。這些器件的最大傳播延遲13 ns,在5 V下脈沖寬度失真小于4.5 ns。具有嚴(yán)格的4.0 ns(最大值)傳播延遲通道間匹配。
    的頭像 發(fā)表于 06-03 10:54 ?848次閱讀
    ADuM250<b class='flag-5'>N</b>/ADuM251<b class='flag-5'>N</b>/ADuM252<b class='flag-5'>N</b>五通道數(shù)字隔離器技術(shù)手冊

    是德N9020A頻譜分析儀在CDMA信號分析與測量的應(yīng)用

    功能,成為CDMA(碼分多址)信號分析與測量的理想選擇。本文將深入探討N9020A在CDMA信號測試的應(yīng)用,解析其技術(shù)優(yōu)勢及具體操作流程,工程師提供實踐參考。 ? 一、N9020A
    的頭像 發(fā)表于 05-21 16:09 ?681次閱讀
    是德<b class='flag-5'>N</b>9020A頻譜分析儀在CDMA信號分析與測量<b class='flag-5'>中</b>的應(yīng)用

    N型單晶硅制備過程拉晶工藝對氧含量的影響

    本文介紹了N型單晶硅制備過程拉晶工藝對氧含量的影響。
    的頭像 發(fā)表于 03-18 16:46 ?1221次閱讀
    <b class='flag-5'>N</b>型單晶硅制備過程<b class='flag-5'>中</b>拉晶工藝對氧含量的影響