mysql 是怎麼在磁碟上是儲存 NULL 的?

2021-10-18 21:38:40 字數 1348 閱讀 3371

大家知道一般表中char,vachar這些欄位都是有值的,那如果某個字段允許為空,且值確實為空,mysql又是怎麼處理的呢?

是不是直接儲存null呢?

假設這個欄位的null值我們在磁碟上儲存的時候,就是按照「null」這麼個字串來儲存,是不是很浪費儲存空間?

因為字串要占用空間的啊(乙個 null 字串要占用四個字元呢),本來他就是個null,說明什麼值都沒有,你還給他存個「null」字串幹什麼呢?

null值列表,顧名思義,說的就是你一行資料裡可能有的字段值是null,比如你的某個字段,它是允許為null的,那麼實際上在儲存的時候,如果你沒給它賦值,那麼這個欄位的值就是null了。

而我們又知道了 null 值是肯定不會直接按照字串的方式存放在磁碟上浪費空間的,那麼它到底是怎麼儲存的呢?

其實null值是以二進位制bit位來儲存的,compact 格式資料中的null值列表就是用來儲存null值的。若有某個字段值為 null,將將其 bit 位置為 1 說明值為 null,bit為 0 說明該字段值不為空。

比如我們有一張學生表,建表語句如下

create

table student (

name varchar(10

)not

null

,age char(2

),gender char(1

),class varchar(20

),) row_format=compact;

該錶有4個字段,分別為name、age 、gender 、class ,代表學生的姓名,年齡,性別,班級,其中有2個變長字段,2個定長欄位,name欄位是宣告了not null的,就是不能為null,其他欄位都可能是null的。

首先看變長字段長度列表,他一共有2個變長字段,並且應該按照逆序的順序,先放class欄位的長度,再放name欄位的值長度。但是這裡由於class欄位沒有值,為null,所以我們只用放name欄位的長度,也就是0x03

接著來看null值列表,對於允許為null的字段,每個欄位都有乙個二進位制bit位的值,如果bit值是1說明是null,如果bit值是0說明不是null。

對於上面的表而言,3個字段都允許為null,每個欄位都會有乙個bit位。

而這一行資料的值是"tom null m null",其中2個字段是null,1個字段不是null,所以3個bit位應該是:101

另外null值列表一般起碼是8個bit位的倍數,如果不足8個bit位就高位補0,所以實際存放的看起來是這樣的:

0x03 00000101 記錄頭資訊 tom m

實際上像"tom" "m"這些字串不是直接以字串的形式存在磁碟上的,而是根據我們資料庫指定的字符集編碼,進行編碼之後再儲存的。

磁碟分割槽,檔案在磁碟上的儲存

一 磁碟物理結構 碟片 機械手臂 磁頭 主軸馬達 磁碟構成描述 磁軌 扇區 柱面 主引導扇區 0磁軌0柱面1扇區,分為 1 主引導記錄mbr 2 分割槽表dpt共64位元組 每個分割槽資訊佔16位元組,故最多四個分割槽 想要實現更多分割槽,可利用擴充套件分割槽 指向乙個更大空間存更多分割槽資訊 建立...

什麼是mysql儲存過程 什麼是mysql儲存過程

mysql中的儲存過程指的是儲存在資料庫中的sql語句集合,當建立好儲存過程後在執行時提供所需引數,儲存過程就可以以 指定的方式使用引數執行並返回值 在mysql中提供了建立儲存過程的能力。儲存過程是mysql以及其他資料庫管理系統中的強大功能。接下來在文章中將為大家具體介紹mysql中的儲存過程,...

Linux 磁碟I O是怎麼工作的

linux 磁碟i o是怎麼工作的?vfs 內部通過目錄項 索引節點 邏輯塊以及超級塊等資料結構,來管理檔案。目錄項,記錄了檔案的名字,以及檔案與其他目錄項之間的目錄關係。索引節點,記錄了檔案的元資料。邏輯塊,是由連續磁碟扇區構成的最小讀寫單元,用來儲存檔案資料。超級塊,用來記錄檔案系統整體的狀態,...