一、測試環境
-
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
- 01:第1個字段可變長度1
- 0000180022:5位元組固定
- 00000014061d:ROWID
- 000000002fe6:TRX ID
- bc000001790110:ROLL PTR
- 20:空字元' '
- 67616f70656e67:第二個字段 'gaopeng'
- 01:NULL位圖為為00000001 表示第一個字段為NULL
- 000020ffac:5位元組固定
- 00000014061e:ROWID
- 000000002feb:TRX ID
- bf0000017c0110:ROLL PTR
- 空:第一個字段NULL
三、總結
- ''不做存儲,但是會記錄可變長度的長度為0,NULL位圖本位為0。
- NULL不做實際存儲,也不會記錄可變長度,但是NULL位圖本位為1。
- ' ' 做存儲為0X20,記錄可變長度為01,NULL位圖本位為0。