隨筆:MySQL中'' ' ' NULL在Innodb儲存的區別

gaopengtttt發表於2019-11-11

歡迎關注我的《深入理解MySQL主從原理 32講 》,如下:

image.png

如果圖片不能顯示可檢視下面連結:
https://www.jianshu.com/p/d636215d767f

一、測試環境

mysql> create table testn(a varchar(20),b varchar(20));
Query OK, 0 rows affected (0.43 sec)
mysql> insert into testn values('','gaopeng');
Query OK, 1 row affected (0.08 sec)
mysql> insert into testn values(' ','gaopeng');
Query OK, 1 row affected (0.12 sec)
mysql> insert into testn values(NULL,'gaopeng');
Query OK, 1 row affected (0.08 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)

我們看到包含了3行,包含了3種情況,下面我們分別分析。

二、解析

第一行 insert into testn values(‘’,’gaopeng’);

原始儲存如下:

070000000010002200000014061c000000002fe5bb0000016e011067616f70656e67
  • 07 :第2個欄位可變長度7
  • 00 :第1個欄位可變長度0
  • 00 :NULL點陣圖 沒有NULL欄位
  • 0000100022:5位元組固定
  • 00000014061c ROWID
  • 000000002fe5 TRX ID
  • bb0000016e0110 ROLL PTR
  • :第一個欄位沒有儲存 字元’’
  • 67616f70656e67 :第二個欄位 ‘gaopeng’

第二行:insert into testn values(‘ ‘,’gaopeng’);

原始儲存如下:

070100000018002200000014061d000000002fe6bc0000017901102067616f70656e67
  • 07 :第2個欄位可變長度7
  • 01 :第1個欄位可變長度1
  • 00 :NULL點陣圖 沒有NULL欄位
  • 0000180022:5位元組固定
  • 00000014061d ROWID
  • 000000002fe6 TRX ID
  • bc000001790110 ROLL PTR
  • 20:空字元’ ‘
  • 67616f70656e67 :第二個欄位 ‘gaopeng’

第三行:insert into testn values(NULL,’gaopeng’);

原始儲存如下:

0701000020ffac00000014061e000000002febbf0000017c011067616f70656e67
  • 07:第2個欄位可變長度7
  • 01:NULL點陣圖為為00000001 表示第一個欄位為NULL
  • 000020ffac:5位元組固定
  • 00000014061e ROWID
  • 000000002feb TRX ID
  • bf0000017c0110 ROLL PTR
  • :第一個欄位NULL
  • 67616f70656e67:第二個欄位 ‘gaopeng’

三、總結

  • ‘’不做儲存,但是會記錄可變長度的長度為0,NULL點陣圖本位為0。
  • NULL不做實際儲存,也不會記錄可變長度,但是NULL點陣圖本位為1。
  • ‘ ‘ 做儲存為0X20,記錄可變長度為01,NULL點陣圖本位為0。

作者微信:gp_22389860

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2663573/,如需轉載,請註明出處,否則將追究法律責任。

相關文章