欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于MySQL在磁盤上存儲NULL值

 更新時(shí)間:2022年02月22日 17:09:04   作者:公眾號JavaEdge  
這篇文章主要介紹了基于MySQL在磁盤上存儲NULL值,NULL值列表,一行數(shù)據(jù)里可能有的字段值是NULL,比如nickname字段,允許為NULL,存儲時(shí),如果沒賦值,這字段值就是NULL,下文關(guān)于NULL值的相關(guān)資料,需要的小伙伴可以參考一下

1 為何不能直接存?zhèn)€NULL?

NULL值列表,一行數(shù)據(jù)里可能有的字段值是NULL,比如nickname字段,允許為NULL,存儲時(shí),如果沒賦值,這字段值就是NULL。
假設(shè)這個(gè)字段的NULL值在磁盤存儲時(shí),就是按“NULL”字符串存儲的,是不是很浪費(fèi)存儲空間而且還奇怪?

2 到底怎么存儲?

不通過字符串,而是通過二進(jìn)制bit位存儲,一行數(shù)據(jù)里假設(shè)有多個(gè)字段的值都是NULL,那么這多個(gè)字段的NULL,就會以bit位形式存放在NULL值列表。

如下表:

CREATE TABLE customer (
? name VARCHAR(10) NOT NULL,
? address VARCHAR(20), gender CHAR(1),
? job VARCHAR(30),
? school VARCHAR(50)
) ROW_FORMAT=COMPACT;

有4個(gè)變長字段,還有個(gè)定長字段,name聲明NOT NULL,其他4個(gè)字段都可能NULL
如下一行數(shù)據(jù)怎么存儲在磁盤呢:

jack NULL m NULL xx_school

有倆字段都是NULL

3 一行數(shù)據(jù)的磁盤存儲格式

思考上面那個(gè)表里的那行案例數(shù)據(jù),在磁盤上如何存儲呢,因?yàn)樗卸鄠€(gè)變長字段,還有多個(gè)字段允許為NULL。首先我們先回顧一下,一行數(shù)據(jù)在磁盤上的存儲格式應(yīng)該是下面這樣的:

變長字段長度列表 NULL值列表 頭信息 column1=value1 column2=value2 ... columnN=valueN

4個(gè)變長字段,逆序先放school字段的長度,再放job、address、name幾個(gè)字段的值長度?
但要區(qū)分一個(gè)問題,若這變長字段值為NULL,就不用在變長字段長度列表里存放他的值長度,所以在上面那行數(shù)據(jù),只有name和school兩個(gè)變長字段有值,把他們的長度按照逆序放在變長字段長度列表即可:

0x09 0x04 NULL值列表 頭信息 column1=value1 column2=value2 ... columnN=valueN

所有允許值為NULL的字段,不是說值就得是NULL,只要是允許為NULL的字段,每個(gè)字段都有個(gè)二進(jìn)制bit位值:

  • bit值是1說明是NULL
  • bit值是0說明不是NULL

比如上面4個(gè)字段都允許為NULL,每個(gè)人都會有一個(gè)bit位,這一行數(shù)據(jù)的值是

jack NULL m NULL xx_school

其中2個(gè)字段是null,2個(gè)字段不是null,所以4個(gè)bit位應(yīng)該是:1010
但實(shí)際放在NULL值列表時(shí),按逆序放,所以NULL值列表里放的:0101,整體這一行數(shù)據(jù)如下:

0x09 0x04 0101 頭信息 column1=value1 column2=value2 ... columnN=valueN

實(shí)際NULL值列表存放時(shí),一般起碼8個(gè)bit位的倍數(shù),不足8個(gè)bit位就高位補(bǔ)0,所以實(shí)際存放如下:

0x09 0x04 00000101 頭信息 column1=value1 column2=value2 ... columnN=valueN

4 如何讀磁盤的一行數(shù)據(jù)?

磁盤數(shù)據(jù)存儲格式:

0x09 0x04 00000101 頭信息 column1=value1 column2=value2 ... columnN=valueN

先讀:

  • 變長字段長度列表

就知道有幾個(gè)變長字段

  • NULL值列表

哪些變長字段是NULL:

從變長字段長度列表中解析出不為NULL的變長字段的值長度,然后也知道哪些字段是NULL。根據(jù)這些信息,就能從實(shí)際的列值存儲區(qū)域里,把你每個(gè)字段的值讀取出來了。

  • 變長字段值,就按值長度讀取,若為NULL,就知道他是個(gè)NULL,沒有值存儲
  • 定長字段,按定長長度讀取

到此這篇關(guān)于基于MySQL在磁盤上存儲NULL值的文章就介紹到這了,更多相關(guān)在磁盤上存儲NULL值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論