中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL中的NULL和空串的區別

發布時間:2021-08-18 18:08:32 來源:億速云 閱讀:309 作者:chen 欄目:MySQL數據庫

本篇內容主要講解“MySQL中的NULL和空串的區別”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“MySQL中的NULL和空串的區別”吧!

今天接到一個MySQL工單,是執行幾條SQL語句。我一看就感覺這語句比較有意思。
語句大體是這樣的:
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的思維來看很多問題,大多數的情況下是相通的,但是還是有一些差別之處。這些就需要額外注意了。
如果用Oracle的眼光來看上面的SQL語句,那基本可以斷定,這個語句就不用執行了。因為在Oracle里面null和空串還是不同的含義,但是使用起來的效果是一樣的。
當然了關于NULL,在MySQL,Oracle中都是is null, is not null這樣的語法,這個也是基本的規范。如果使用=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和空串是什么情況呢,我們來看看。
使用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)
如果看上面的結果,很容易會以為兩者的效果是一致的。我也差點被這種情況誤導。我們再來看一個。
> 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)
而直接忽略這個字段是否為空,查看所有匹配的數據,可以看出,也就這些數據了。
> select count(*)from app_code_value where task_id=378 ;
+----------+
| count(*) |
+----------+
|   180000 |
+----------+
1 row in set (5.41 sec)
從上面的測試可以看出,null和空串還是存在一定的差別。如果要形象一點來區分,我看到一個例子很不錯,是拿真空和空氣的關系來類比空串和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)
而要更具體一些來區分,可以使用length。當然我們可以順帶做一些測試。
create table test_null(id int,name varchar(30));
我們來看看數字類型的表現。
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)
可以看到數字類型int的處理,空串會處理成0
我們來清空數據,看看字符型的表現。
truncate table test_null;
字符類型插入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)
空串的處理還是特別的。空串就是空串。
我們來看看使用length來比較這兩個字段的結果。
>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)
空串的長度是0,而null的長度還是null,這個和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

到此,相信大家對“MySQL中的NULL和空串的區別”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

延安市| 新泰市| 通江县| 枞阳县| 什邡市| 得荣县| 舞阳县| 松江区| 娄烦县| 定兴县| 四川省| 阿拉善右旗| 中宁县| 淄博市| 玉树县| 秭归县| 易门县| 涞水县| 托克托县| 渝北区| 阳高县| 长泰县| 德保县| 抚顺市| 铁岭市| 文成县| 双峰县| 清新县| 新乐市| 夏河县| 商南县| 金阳县| 南京市| 高邑县| 华亭县| 綦江县| 博罗县| 肃北| 马龙县| 封丘县| 务川|