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
語句大體是這樣的:
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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2121639/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL中NULL欄位的比較問題MySqlNull
- Java中空串和null串的區別JavaNull
- MySQL中is not null和!=null和<>null的區別MySqlNull
- Oracle空串與null的處理OracleNull
- MySQL 中的 distinct 和 group by 的效能比較MySql
- Mysql中的Datetime和Timestamp比較MySql
- MongoDB和MySQL比較MongoDBMySql
- Mysql中的Btree與Hash索引比較MySql索引
- Oracle的null和空串【一切有為法,如夢幻泡影 】OracleNull
- DB2的字元型欄位,NULL與空串DB2字元Null
- ORACLE 中IN和EXISTS比較Oracle
- mysql中count(1)與count(*)比較MySql
- 360°全方位比較PostgreSQL和MySQLMySql
- (轉)ORACLE 中IN和EXISTS比較Oracle
- 堆和棧在程式中的比較
- powershell中的where和foreach比較
- Oracle 在連線條件裡處理和比較 NULL 值OracleNull
- PLSQL Language Referenc-PL/SQL集合和記錄-集合比較-和NULL比較可變陣列和巢狀表變數SQLNull陣列巢狀變數
- MySQL 的 timestamp 和 datetime 型別比較MySql型別
- MySQL和MSSQL下,text、ntext、image、blob的比較MySql
- MYSQL和ORACLE時區設定比較MySqlOracle
- js 深比較和淺比較JS
- MySQL null和''分析MySqlNull
- PostgreSQL與MySQL的比較 - hackrMySql
- 使用perl比較mysql的版本MySql
- MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!MySqlNull索引
- PostgreSQL與MySQL比較MySql
- MySQL中MyISAM引擎與InnoDB引擎效能比較MySql
- 比較有索引和無索引的查詢速度(在mysql資料庫中)索引MySql資料庫
- 資料庫系列:MySQL引擎MyISAM和InnoDB的比較資料庫MySql
- 檢視oracle資料庫中,哪些表的欄位是null值比較多Oracle資料庫Null
- undefined與除去null的其他資料比較返回都是falseUndefinedNullFalse
- Zope的優點和Apache+PHP+MySQL的比較(轉)ApachePHPMySql
- Python 中 NaN 和 None 的詳細比較PythonNaNNone
- c#中結構體和類的比較C#結構體
- Java 中 Comparable 和 Comparator 比較Java
- Go中泛型和反射比較指南Go泛型反射
- ejb 和 javabean的比較JavaBean