最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(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ū)別呢?的評論 (共 條)

分享到微博請遵守國家法律
甘谷县| 铅山县| 连州市| 邵阳市| 台前县| 华蓥市| 灌云县| 旺苍县| 舞阳县| 南开区| 改则县| 昆明市| 青铜峡市| 庐江县| 樟树市| 巴林左旗| 越西县| 河津市| 海安县| 嘉祥县| 东兴市| 巴彦淖尔市| 庐江县| 佛坪县| 北流市| 彭阳县| 肃宁县| 遂川县| 富平县| 平武县| 定州市| 遵义市| 贺州市| 湖南省| 巴里| 阳朔县| 藁城市| 阿拉善左旗| 莱阳市| 西乌珠穆沁旗| 特克斯县|