天天看點

Innodb 下null '' ' '的存儲表現的不同

今天順便測試了一下 他們三者是不同的,簡單的說就是

  • null :nullbits 位圖上的差別。
  • '':可變位元組多一個位元組。
  • ' ':可變位元組多一個位元組且實際資料區域為0X20多一個位元組。

如下語句:

mysql> show create table testnull1 \G
*************************** 1. row ***************************
       Table: testnull1
Create Table: CREATE TABLE `testnull1` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `name1` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> insert into testnull1 values(1,'gaopeng','gaopeng');
Query OK, 1 row affected (0.22 sec)
mysql> insert into testnull1 values(1,'','gaopeng');
Query OK, 1 row affected (0.22 sec)
mysql> insert into testnull1 values(1,null,'gaopeng');
Query OK, 1 row affected (0.22 sec)
mysql> insert into testnull1 values(1,' ','gaopeng');
Query OK, 1 row affected (0.22 sec)

mysql> select * from testnull1;
+------+---------+---------+
| id   | name    | name1   |
+------+---------+---------+
|    1 | gaopeng | gaopeng |
|    1 |         | gaopeng |
|    1 | NULL    | gaopeng |
|    1 |         | gaopeng |
+------+---------+---------+
4 rows in set (0.00 sec)           

主要觀察第2,3,4行。

  • 第二行:

07 00:2位元組可變字段長度,第二個00代表name 字段的長度,這裡''長度是0

00: null位圖

0000180025:fixed extrasize

0000012065100000000ec9e9b1000014210110:rowid+trx_id+rollback_ptr

80000001:資料1

67616f70656e67:資料‘gaopeng’

  • 第三行

07:1位元組可變長度

02:null位圖

0000200026:fixed extrasize

0000012065110000000ec9eeb4000014060110:rowid+trx_id+rollback_ptr

  • 第四行

0701:2位元組可變長度,01代表是name字段長度

00:null位圖

000028ff78:fixed extrasize

0000012065120000000ec9f0b6000014040110:rowid+trx_id+rollback_ptr

20:資料' '

可以看到他們的差別