最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2024年08月31日 10:44:31   作者:Java知識庫  
本文主要介紹了MySQL中varchar(n) 中n最大取值為多少

前置知識

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

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

可以看到,一條完整的記錄分為「記錄的額外信息」和「記錄的真實數(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 值列表

用于標記一行記錄中字段值為 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)容很多,比如記錄的刪除標記位,指向下一條記錄的指針等等,不是本文問題的重點,所以我就不細講了。

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ù)庫表。

CREATE TABLE test ( 
`name` VARCHAR(65535)  NULL
) ENGINE = InnoDB DEFAULT CHARACTER SET = ascii ROW_FORMAT = COMPACT;

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

結(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 標識,如果不允許為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)  是否可行?

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

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

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

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

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

多字段的情況

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

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

總結(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。

到此這篇關(guān)于MySQL中varchar(n) 中n最大取值為多少的文章就介紹到這了,更多相關(guān)MySQL varchar(n)  n最大取值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • Mysql和redis緩存不一致問題的解決方案

    Mysql和redis緩存不一致問題的解決方案

    在高并發(fā)的情況下,如果所有的數(shù)據(jù)都從數(shù)據(jù)庫中去讀取,那再強大的數(shù)據(jù)庫系統(tǒng)都承受不了這個壓力,因此我們會將部分數(shù)據(jù)放入緩存中,比如放入redis中,這篇文章主要給大家介紹了關(guān)于Mysql和redis緩存不一致問題的解決方案,需要的朋友可以參考下
    2022-08-08
  • MySQL中DATE_FORMAT時間函數(shù)的使用小結(jié)

    MySQL中DATE_FORMAT時間函數(shù)的使用小結(jié)

    本文主要介紹了MySQL中DATE_FORMAT時間函數(shù)的使用小結(jié),用于格式化日期/時間字段,可提取年月、統(tǒng)計月份數(shù)據(jù)、精確到天,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-08-08
  • 基于MySQL實現(xiàn)基礎(chǔ)圖數(shù)據(jù)庫的詳細步驟

    基于MySQL實現(xiàn)基礎(chǔ)圖數(shù)據(jù)庫的詳細步驟

    圖數(shù)據(jù)庫是一種用于存儲和查詢具有復(fù)雜關(guān)系的數(shù)據(jù)的數(shù)據(jù)庫,能夠快速地查詢和處理節(jié)點之間的關(guān)系,本文將使用MySQL實現(xiàn)一個基礎(chǔ)的圖數(shù)據(jù)庫,有需要的小伙伴可以了解下
    2025-07-07
  • mysql?blocked?because?of?many?connection?errors解決記錄

    mysql?blocked?because?of?many?connection?errors解決記錄

    這篇文章主要為大家介紹了mysql?blocked?because?of?many?connection?errors解決方法記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • MySQL出現(xiàn)1055錯誤:ONLY_FULL_GROUP_BY的問題解決

    MySQL出現(xiàn)1055錯誤:ONLY_FULL_GROUP_BY的問題解決

    當你執(zhí)行SQL查詢時突然遇到"1055 - Expression #1 of SELECT list is not in GROUP BY clause…"錯誤,該怎么辦呢,下面小編就來和大家簡單講講吧
    2025-07-07
  • MySQL中使用ProxySql實現(xiàn)讀寫分離

    MySQL中使用ProxySql實現(xiàn)讀寫分離

    ProxySQL是一款高性能、開源的MySQL數(shù)據(jù)庫中間件,通過安裝ProxySQL并配置主從服務(wù)器、用戶及路由規(guī)則,實現(xiàn)MySQL讀寫分離,提升負載均衡與高可用性,本文給大家介紹MySQL中使用ProxySql實現(xiàn)讀寫分離,感興趣的朋友一起看看吧
    2025-08-08
  • MySQL中的JSON字段List成員檢查

    MySQL中的JSON字段List成員檢查

    這篇文章主要介紹了MySQL中的JSON字段List成員檢查,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 分詞搜索必須上Elasticsearch?試試MySQL分詞查詢技術(shù)

    分詞搜索必須上Elasticsearch?試試MySQL分詞查詢技術(shù)

    文章介紹了MySQL的全文索引及其分詞查詢技術(shù),從原理、配置、基本查詢、中文分詞、進階優(yōu)化與監(jiān)控等多個方面進行詳細闡述,適合中小型項目簡單分詞搜索需求,感興趣的朋友跟隨小編一起看看吧
    2026-04-04
  • MySQL索引介紹及優(yōu)化方式

    MySQL索引介紹及優(yōu)化方式

    這篇文章主要介紹了MySQL索引介紹及優(yōu)化方式,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • mysql8.0使用PXC實現(xiàn)高可用

    mysql8.0使用PXC實現(xiàn)高可用

    本文主要介紹了mysql8.0使用PXC實現(xiàn)高可用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02

最新評論

西青区| 分宜县| 临邑县| 灵丘县| 方城县| 盐池县| 泰来县| 淮滨县| 习水县| 左贡县| 玉龙| 论坛| 沙雅县| 临夏县| 合水县| 昆明市| 巧家县| 若尔盖县| 阿合奇县| 英超| 丰台区| 壶关县| 云林县| 德阳市| 上思县| 吉林省| 阜平县| 水城县| 宜都市| 含山县| 怀宁县| 南投市| 襄樊市| 莎车县| 古丈县| 顺平县| 平安县| 淄博市| 赣榆县| 加查县| 阿尔山市|