日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

大家好,我是小林。

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

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

所以,這次就聊聊這個(gè)問(wèn)題。

前置知識(shí)

要回答這個(gè)問(wèn)題,首先我們得先知道 MySQL 存儲(chǔ)一條記錄的格式長(zhǎng)什么樣子。

以 Compact 行格式作為例子,它長(zhǎng)這樣:

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

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

這里重點(diǎn)講講記錄的額外信息,它包含 3 個(gè)部分:變長(zhǎng)字段長(zhǎng)度列表、NULL 值列表、記錄頭信息。

  • 變長(zhǎng)字段長(zhǎng)度列表

用于存儲(chǔ)一行記錄中每個(gè)變長(zhǎng)字段的長(zhǎng)度。

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

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

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

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

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

  • NULL 值列表

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

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

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

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

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

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

  • 記錄頭信息

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

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

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

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

知道了這個(gè)前提之后,我們?cè)賮?lái)看看這個(gè)問(wèn)題:「varchar(n) 中 n 最大取值為多少?」

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

要算 varchar(n) 最大能允許存儲(chǔ)的字節(jié)數(shù),還要看數(shù)據(jù)庫(kù)表的字符集,因?yàn)樽址碇?個(gè)字符要占用多少字節(jié)。

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

單字段的情況

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

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

不著急說(shuō)結(jié)論,我們先來(lái)做個(gè)實(shí)驗(yàn)驗(yàn)證一下。

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

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

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

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

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

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

問(wèn)題來(lái)了,這個(gè) storage overhead 是什么呢?其實(shí)就是「變長(zhǎng)字段長(zhǎng)度列表」和 「NULL 值列表」。

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

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

這是因?yàn)槲覀兇鎯?chǔ)字段類型為 varchar(n) 的數(shù)據(jù)時(shí),其實(shí)分成了三個(gè)部分來(lái)存儲(chǔ):

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

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

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

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

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

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

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

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

因?yàn)槲覀冞@個(gè)案例是只有 1 個(gè)變長(zhǎng)字段,所以「變長(zhǎng)字段長(zhǎng)度列表」= 1 個(gè)「變長(zhǎng)字段長(zhǎng)度」占用的字節(jié)數(shù),也就是 2 字節(jié)。

因?yàn)槲覀冊(cè)谒?varchar(n) 中 n 最大值時(shí),需要減去 「變長(zhǎng)字段長(zhǎng)度列表」和 「NULL 值列表」所占用的字節(jié)數(shù)的。

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

我們先來(lái)測(cè)試看看 varchar(65533) 是否可行?

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

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

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

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

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

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

上面所說(shuō)的只是針對(duì)于一個(gè)字段的計(jì)算方式。

多字段的情況

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

這里舉個(gè)多字段的情況的例子。

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

實(shí)驗(yàn)結(jié)果:

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

總結(jié)

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

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

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

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

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


歷史好文:

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

美團(tuán)三面:一直追問(wèn)我, MySQL 幻讀被徹底解決了嗎?

保姆級(jí)教程!2 萬(wàn)字 + 30 張圖搞懂 MySQL 是怎么加行級(jí)鎖的?

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


審核編輯 :李倩


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

    關(guān)注

    8

    文章

    7349

    瀏覽量

    95055
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    931

    瀏覽量

    29775

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    Onsemi N溝道SOT - 23 MOSFET:MGSF1N02L和MVGSF1N02L的深度解析

    、產(chǎn)品概述 MGSF1N02L和MVGSF1N02L是微型表面貼裝MOSFET,其最大的亮點(diǎn)在于低導(dǎo)通電阻($R {DS(on)}$)。低$R {DS(on)}$意味著在工作過(guò)程能夠
    的頭像 發(fā)表于 04-20 11:50 ?313次閱讀

    深入解析 onsemi NTA4001N 和 NVA4001N MOSFET

    是 onsemi 推出的具有柵極 ESD 保護(hù)功能的小信號(hào) MOSFET,適用于多種便攜式應(yīng)用。它們的耐壓 20V,最大連續(xù)漏極電流可達(dá) 238mA,具備低柵極電荷,可實(shí)現(xiàn)快速開(kāi)關(guān)。NVA4001N 還通過(guò)了
    的頭像 發(fā)表于 04-19 14:40 ?115次閱讀

    NTGS3130N與NVGS3130N MOSFET:小身材大能量的電子利器

    : NTGS3130N-D.PDF 一、產(chǎn)品概述 NTGS3130N 和 NVGS3130N 采用 TSOP - 6 封裝,尺寸僅為 3 x 2.75 mm,如此小巧的身材卻蘊(yùn)含著強(qiáng)大的性能。它們的額定電壓
    的頭像 發(fā)表于 04-19 12:00 ?239次閱讀

    深入解析NTD5407N、STD5407N、NVD5407N MOSFET

    、NVD5407N屬于N溝道單功率MOSFET,采用DPAK封裝,額定電壓40V,最大電流可達(dá)38A。這些產(chǎn)品具有諸多特性,使其在電子設(shè)計(jì)
    的頭像 發(fā)表于 04-14 10:25 ?127次閱讀

    合科泰MOSFET選型7N60與7N65的核心區(qū)別

    在MOSFET選型過(guò)程,工程師經(jīng)常遇到一些疑問(wèn),如型號(hào)為7N60和7N65的器件究竟有什么區(qū)別,以及能否直接相互替換。從命名規(guī)則來(lái)看,7N60和7
    的頭像 發(fā)表于 04-14 10:02 ?363次閱讀
    合科泰MOSFET選型<b class='flag-5'>中</b>7<b class='flag-5'>N</b>60與7<b class='flag-5'>N</b>65的核心區(qū)別

    安森美NTMYS014N06CL N溝道功率MOSFET深度解析

    應(yīng)用的N溝道功率MOSFET。其額定電壓V(BR)DSS60V,最大漏源導(dǎo)通電阻RDS(ON)在10V柵源電壓下為15mΩ,在4.5V柵源電壓下為21.5mΩ,最大漏極電流ID可達(dá)
    的頭像 發(fā)表于 04-10 09:30 ?138次閱讀

    安森美NTTFS024N06C N溝道MOSFET深度解析

    安森美NTTFS024N06C N溝道MOSFET深度解析 在電子工程師的日常設(shè)計(jì),MOSFET是一種極為常見(jiàn)且關(guān)鍵的元件。今天我們就來(lái)深入探討一下安森美(onsemi)推出
    的頭像 發(fā)表于 04-09 17:10 ?605次閱讀

    深入解析 onsemi NVTFS004N04C N 溝道 MOSFET

    深入解析 onsemi NVTFS004N04C N 溝道 MOSFET 在電子設(shè)計(jì)領(lǐng)域,MOSFET 是至關(guān)重要的功率器件,廣泛應(yīng)用于各種電路。今天我們來(lái)詳細(xì)解析 onsemi 推出
    的頭像 發(fā)表于 04-08 15:45 ?252次閱讀

    深入解析 onsemi NVTFS6H888N N 溝道功率 MOSFET

    NVTFS6H888N 是 onsemi 推出的一款 N 溝道功率 MOSFET,具備 80V 的漏源擊穿電壓(V(BR)DSS),最大漏源導(dǎo)通電阻(RDS(on)) 55 mΩ(
    的頭像 發(fā)表于 04-08 11:30 ?227次閱讀

    解析NVMFS6H824N:高性能單N溝道MOSFET的卓越之選

    解析NVMFS6H824N:高性能單N溝道MOSFET的卓越之選 在電子設(shè)計(jì)領(lǐng)域,MOSFET是一種至關(guān)重要的器件,廣泛應(yīng)用于各類電路。今天我們要深入探討的是安森美(onsemi
    的頭像 發(fā)表于 04-03 16:10 ?138次閱讀

    深入解析NVMJD8D1N04C雙N溝道MOSFET

    ——NVMJD8D1N04C。 文件下載: NVMJD8D1N04C-D.PDF 產(chǎn)品概述 NVMJD8D1N04C是一款雙N溝道MOSFET,具有40V的耐壓能力,
    的頭像 發(fā)表于 04-03 11:35 ?283次閱讀

    探索 onsemi NVTFS015N04C N 溝道功率 MOSFET

    探索 onsemi NVTFS015N04C N 溝道功率 MOSFET 在電子設(shè)計(jì)領(lǐng)域,功率 MOSFET 是至關(guān)重要的元件,它們?cè)诒姸嚯娐?b class='flag-5'>中扮演著關(guān)鍵角色。今天,我們將深入探討 onsemi
    的頭像 發(fā)表于 04-02 14:45 ?230次閱讀

    探索 onsemi FDP22N50N:高性能 N 溝道 MOSFET 的卓越之選

    探索 onsemi FDP22N50N:高性能 N 溝道 MOSFET 的卓越之選 在電子工程師的日常設(shè)計(jì),MOSFET 是至關(guān)重要的元件之一。今天,我們就來(lái)深入了解 onsemi 推出的一款
    的頭像 發(fā)表于 03-29 14:35 ?196次閱讀

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

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

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

    在網(wǎng)線標(biāo)識(shí)及電氣領(lǐng)域中,“N”通常代表零線(Neutral Wire),“L”通常代表火線(Live Wire)。以下是具體說(shuō)明: N(零線) 定義:零線是電氣系統(tǒng)的中性線,負(fù)責(zé)將電流從負(fù)載(如
    的頭像 發(fā)表于 07-29 10:19 ?1.7w次閱讀
    網(wǎng)線標(biāo)識(shí)<b class='flag-5'>中</b><b class='flag-5'>n</b>是代表什么線l是代表什么線
    芒康县| 宜川县| 专栏| 衡山县| 得荣县| 安福县| 稻城县| 师宗县| 兰西县| 嘉义县| 乳山市| 广河县| 姚安县| 禹州市| 金平| 丰城市| 盐津县| 连山| 云和县| 固始县| 荃湾区| 凤台县| 原阳县| 个旧市| 攀枝花市| 桓仁| 天峻县| 乐都县| 日土县| 新津县| 揭阳市| 玉山县| 湖州市| 昌图县| 浑源县| 聂拉木县| 烟台市| 西乌| 盐城市| 简阳市| 泽普县|