本篇內容主要講解“中的NULL和空串的區別”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強。下面就讓小編來(lái)帶大家學(xué)習“MySQL中的NULL和空串的區別”吧!
今天接到一個(gè)MySQL工單,是執行幾條SQL語(yǔ)句。我一看就感覺(jué)這語(yǔ)句比較有意思。
語(yǔ)句大體是這樣的:
update app_code_value set channel_id=null where task_id=378 and channel_id='';
update app_code_value set channel_id=null where task_id=379 and channel_id='';
因為對Oracle熟悉一些,所以總是喜歡用Oracle的思維來(lái)看很多問(wèn)題,大多數的情況下是相通的,但是還是有一些差別之處。這些就需要額外注意了。
如果用Oracle的眼光來(lái)看上面的SQL語(yǔ)句,那基本可以斷定,這個(gè)語(yǔ)句就不用執行了。因為在Oracle里面null和空串還是不同的含義,但是使用起來(lái)的效果是一樣的。
當然了關(guān)于NULL,在MySQL,Oracle中都是is null, is not null這樣的語(yǔ)法,這個(gè)也是基本的規范。如果使用=null這樣的情況,效果和oracle是一致的。
select count(*)from app_code_value where task_id=378 and channel_id=null;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
在MySQL里面的null和空串是什么情況呢,我們來(lái)看看。
使用is null
> select count(*)from app_code_value where task_id=378 and channel_id is null;
+----------+
| count(*) |
+----------+
| 90000 |
+----------+
1 row in set (14.46 sec)
使用空串
> select count(*)from app_code_value where task_id=378 and channel_id ='';
+----------+
| count(*) |
+----------+
| 90000 |
+----------+
1 row in set (14.46 sec)
如果看上面的結果,很容易會(huì )以為兩者的效果是一致的。我也差點(diǎn)被這種情況誤導。我們再來(lái)看一個(gè)。
> select count(*)from app_code_value where task_id=378 and (channel_id is null or channel_id ='');
+----------+
| count(*) |
+----------+
| 180000 |
+----------+
1 row in set (5.41 sec)
而直接忽略這個(gè)字段是否為空,查看所有匹配的數據,可以看出,也就這些數據了。
> select count(*)from app_code_value where task_id=378 ;
+----------+
| count(*) |
+----------+
| 180000 |
+----------+
1 row in set (5.41 sec)
從上面的測試可以看出,null和空串還是存在一定的差別。如果要形象一點(diǎn)來(lái)區分,我看到一個(gè)例子很不錯,是拿真空和空氣的關(guān)系來(lái)類(lèi)比空串和null。
null和timestamp
(root:localhost:Wed Jul 6 22:46:46 2016)[test]>create table test_null ( id int,date timestamp);
insert into test_null values(1,nQuery OK, 0 rows affected (0.16 sec)
(root:localhost:Wed Jul 6 22:46:51 2016)[test]>insert into test_null values(1,null);
Query OK, 1 row affected (0.00 sec)
(root:localhost:Wed Jul 6 22:46:51 2016)[test]>select *from test_null;
+------+------+
| id | date |
+------+------+
| 1 | NULL |
+------+------+
1 row in set (0.00 sec)
而要更具體一些來(lái)區分,可以使用length。當然我們可以順帶做一些測試。
create table test_null(id int,name varchar(30));
我們來(lái)看看數字類(lèi)型的表現。
insert into test_null(id) values(null);
insert into test_null(id) values('');
>select *from test_null;
+------+------+
| id | name |
+------+------+
| NULL | NULL |
| 0 | NULL |
+------+------+
2 rows in set (0.00 sec)
可以看到數字類(lèi)型int的處理,空串會(huì )處理成0
我們來(lái)清空數據,看看字符型的表現。
truncate table test_null;
字符類(lèi)型插入null和空串
insert into test_null(name) values(null);
insert into test_null(name) values('');
查看結果如下:
>select *from test_null;
+------+------+
| id | name |
+------+------+
| NULL | NULL |
| NULL | |
+------+------+
2 rows in set (0.00 sec)
空串的處理還是特別的??沾褪强沾?。
我們來(lái)看看使用length來(lái)比較這兩個(gè)字段的結果。
>select length(id),id,length(name),name from test_null;
+------------+------+--------------+------+
| length(id) | id | length(name) | name |
+------------+------+--------------+------+
| NULL | NULL | NULL | NULL |
| NULL | NULL | 0 | |
+------------+------+--------------+------+
2 rows in set (0.01 sec)
空串的長(cháng)度是0,而null的長(cháng)度還是null,這個(gè)和Oracle的差別就很明顯了。
在Oracle中的測試如下:
create table test_null (id number,name varchar2(30));
SQL> insert into test_null values(1,null);
1 row created.
SQL> insert into test_null values(2,'');
1 row created.
SQL> select *from test_null;
ID NAME
---------- ------------------------------
1
2
SQL> select length(id),id,length(name),name from test_null;
LENGTH(ID) ID LENGTH(NAME) NAME
---------- ---------- ------------ ------------------------------
1 1
1 2
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站