五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

MySQL數(shù)據(jù)庫的表中 NULL 和 空值 到底有什么區(qū)別呢?

2020-09-14 18:55 作者:極客小俊GeekerJun  | 我要投稿

極客小俊

一個專注于web技術(shù)的80后

你不用拼過聰明人,你只需要拼過那些懶人 你就一定會超越大部分人!



我們來淺談一下MySQL中的 NULL 和 空值的區(qū)別

NULL也就是在字段中存儲NULL值

空字符串值也就是字段中存儲空字符('')


我們來通過測試來看看 他們彼此的區(qū)別:

1、占用空間區(qū)別

?mysql> select length(NULL), length(''), length('1');
?+--------------+------------+-------------+
?| length(NULL) | length('') | length('1') |
?+--------------+------------+-------------+
?| ? ? ? ? NULL | ? ? ? ? ?0 | ? ? ? ? ? 1 |
?+--------------+------------+-------------+
?1 row in set (0.03 sec)
?

小結(jié) ?: 從上面的測試可以看出 字符串空值('')的長度是0,是不占用空間的, ? 而的NULL長度是NULL,其實(shí)它是占用空間的!

NULL columns require additional space in the row to record whether their values are NULL.

意思是: NULL列需要行中的額外空間來記錄它們的值是否為NULL

通俗意義上講: ('')字符串空值就像是一個真空轉(zhuǎn)態(tài)杯子,什么都沒有,而NULL值就是一個裝滿空氣的杯子,雖然看起來都是一樣的,但是有著本質(zhì)的區(qū)別


2、插入方式區(qū)別

?#創(chuàng)建一個表,tb_test
?
?create table tb_test(
? ?id int unsigned primary key auto_increment,
? ?one varchar(10) NOT NULL,
? ?two varchar(255) DEFAULT NULL
?) ENGINE=InnoDB DEFAULT CHARSET=utf8;
?
?
?插入進(jìn)行驗(yàn)證:
?
?#全部插入 NULL,會失敗 ?原因就是指定的不允許插入NULL
?insert into tb_test(one,two) value (NULL,NULL);
?1048 - Column 'one' cannot be null
?
?#全部插入 空字符串值,成功 ?原因就是 ('') 字符 和 NULL的類型都不一樣 指定的是不允許插入NULL,又沒有說不允許('')空字符串!^.^
?insert into tb_test(one,two) value ('','');
?Query OK, 1 row affected
?#這也是剛剛講過not null約束測試insert語句的時候, 插入('')空字符串會成功的原因!
?


3、在查詢方式上的區(qū)別對比

?#創(chuàng)建一個表,tb_test2
?
?create table tb_test2(
? ?id int unsigned primary key auto_increment,
? ?one varchar(10) NOT NULL,
? ?two varchar(255) DEFAULT NULL
?) ENGINE=InnoDB DEFAULT CHARSET=utf8;
?
?#模擬數(shù)據(jù):
?insert into tb_test2(one,two) values (1,NULL);
?insert into tb_test2(one,two) values ('',2);
?insert into tb_test2(one,two) values (3,3);
?
?#查詢one字段
?#使用 is null 來查詢one字段
?select * FROM tb_test2 where one is null; #結(jié)果就是一條也沒有,因?yàn)閛ne字段并沒有代表為NULL的數(shù)據(jù)存在!
?
?#使用 is not null 來查詢one字段
?select * FROM tb_test2 where one is not null; ?#結(jié)果被全部查詢出來,因?yàn)閛ne字段中的三個數(shù)據(jù)都不為NULL這個類型
?
?#使用 = 和 != 來查詢one字段
?select * FROM tb_test2 where one ='';
?select * FROM tb_test2 where one != '';
?
?#查詢two字段
?#使用 is null 來查詢two字段
?select * FROM tb_test2 where two is null; ?#結(jié)果有一條符合NULL,
?
?#使用 is not null 來查詢two字段
?select * FROM tb_test2 where two is not null; #結(jié)果是不符合NULL的有兩條
?
?
?#使用 = 來查詢two字段
?select * FROM tb_test2 where two ='';
?
?#使用 != 來查詢two字段
?#這里要注意的是為NULL的并沒有查詢出來,原因用 != 來查 字符串空('')的時候, 會把NULL也當(dāng)做是字符串空來判斷吧!
?select * FROM tb_test2 where two != '';
?
?

小結(jié): ?如果要單純查NULL值列,則使用 is NULL去查,單純?nèi)ゲ榭罩?'')列,則使用 =''。

建議查詢方式:NULL值查詢使用is null/is not null查詢,而空值('')可以使用=或者!=、<、>等算術(shù)運(yùn)算符來查!


4、在count()統(tǒng)計(jì)函數(shù)上的區(qū)別

?#創(chuàng)建一個表,tb_test3
?
?create table tb_test3(
? ?id int unsigned primary key auto_increment,
? ?one varchar(10) NOT NULL,
? ?two varchar(255) DEFAULT NULL
?) ENGINE=InnoDB DEFAULT CHARSET=utf8;
?
?#模擬數(shù)據(jù):
?insert into tb_test3(one,two) values (1,NULL);
?insert into tb_test3(one,two) values ('',2);
?insert into tb_test3(one,two) values (3,3);
?
?#使用COUNT函數(shù)統(tǒng)計(jì)one字段:
?select count(one) from tb_test3; ? #結(jié)果為: 3 條, 說明 空字符串('') 會被count()函數(shù)統(tǒng)計(jì)!
?#使用COUNT函數(shù)統(tǒng)計(jì)two字段:
?select count(two) from tb_test3; ? #結(jié)果為: 2條, ?原因是NULL 不會被count()函數(shù)統(tǒng)計(jì)到!
?
?#注意: 使用 * 號來統(tǒng)計(jì)會把NULL算進(jìn)去!
?SELECT count(*) FROM tb_test;
?+----------+
?| count(*) |
?+----------+
?| ? ? ? ?3 |
?+----------+
?


實(shí)際開發(fā)到底是使用NULL值還是空值('')呢?

根據(jù)實(shí)際業(yè)務(wù)來進(jìn)行區(qū)分, 個人建議在實(shí)際開發(fā)中如果沒有特殊的業(yè)務(wù)場景,可以直接使用空字符串值('') !


如果喜歡話請 點(diǎn)贊 ?投幣 ?收藏 一鍵三連 ?

大家的支持就是我堅(jiān)持下去的動力!

不要忘了?? 關(guān)注 ??哦!




MySQL數(shù)據(jù)庫的表中 NULL 和 空值 到底有什么區(qū)別呢?的評論 (共 條)

分享到微博請遵守國家法律
青河县| 安福县| 商丘市| 阿坝县| 大邑县| 贵阳市| 济源市| 阳东县| 黑山县| 磐安县| 津市市| 桃园县| 惠安县| 泰来县| 和林格尔县| 长兴县| 新龙县| 伊宁县| 且末县| 竹溪县| 株洲市| 喀喇| 阳江市| 邢台县| 凤城市| 永靖县| 庆安县| 兰考县| 阿拉善左旗| 定安县| 资阳市| 安国市| 沭阳县| 柏乡县| 和政县| 岳池县| 米林县| 建湖县| 安福县| 航空| 海门市|