天天看點

MySQL中'' ' ' NULL在Innodb存儲的差別

一、測試環境

  1. mysql> create table testn(a varchar(20),b varchar(20));

  2. Query OK, 0 rows affected (0.43 sec)

  3. mysql> insert into testn values('','gaopeng');

  4. Query OK, 1 row affected (0.08 sec)

  5. mysql> insert into testn values(' ','gaopeng');

  6. Query OK, 1 row affected (0.12 sec)

  7. mysql> insert into testn values(NULL,'gaopeng');

  8. Query OK, 1 row affected (0.08 sec)

  9. mysql> commit;

  10. Query OK, 0 rows affected (0.00 sec)

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

二、解析

  1. 第一行 insert into testn values('','gaopeng');

原始存儲如下:

  1. 070000000010002200000014061c000000002fe5bb0000016e011067616f70656e67

  • 07:第2個字段可變長度7
  • 00:第1個字段可變長度0
  • 00:NULL位圖 沒有NULL字段
  • 0000100022:5位元組固定
  • 00000014061c:ROWID
  • 000000002fe5:TRX ID
  • bb0000016e0110:ROLL PTR
  • 空:第一個字段沒有存儲 字元''
  • 67616f70656e67 :第二個字段 'gaopeng'
  1. 第二行:insert into testn values(' ','gaopeng');

  1. 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。