1. 程式人生 > >MY SQL中''與null的區別

MY SQL中''與null的區別

平時我們在使用MySQL的時候,對於MySQL中的NULL值和空值區別不能很好的理解。注意到NULL值是未知的,且佔用空間,不走索引,DBA建議建表的時候最好設定欄位是NOT NULL 來避免這種低效率的事情的發生。

問題 1: 首先,我們需要搞清楚 “空值” 和”NULL”的概念:

1:空值('')是不佔用空間的

2: MySQL中的NULL其實是佔用空間的。官方文件說明:

“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”

問題1:
長度驗證:注意空值的”之間是沒有空格的。

mysql> select length(”),length(null),length(’ ‘);

+————+————–+————–+

| length(”) | length(null) | length(’ ‘) |

+————+————–+————–+

| 0 | NULL | 2 |

+————+————–+————–+

問題2:

判斷欄位不為空的時候,查詢語句到底是用 select * from tablename where columnname <> ” 還是用

select * from tablename where column is not null,2個查詢語句有啥不同。

eg:

mysql> show create table testaa;

+——–+———————————————————————————————————————————————————————-+

| Table | Create Table |

+——–+———————————————————————————————————————————————————————-+

| testaa | CREATE TABLE testaa (

a int(11) NOT NULL,

b varchar(20) DEFAULT NULL,

c varchar(20) NOT NULL,

PRIMARY KEY (a)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

插入測試資料:

mysql> insert testaa values (1,’aa’,”);

Query OK, 1 row affected (0.00 sec)

mysql> insert testaa values (2,”,”);

Query OK, 1 row affected (0.00 sec)

mysql> insert testaa values (3,null,”);

Query OK, 1 row affected (0.00 sec)

mysql> insert testaa values (4,NULL,”);

Query OK, 1 row affected (0.00 sec)

mysql> insert testaa values (5,’aafa’,’fa’);

Query OK, 1 row affected (0.00 sec)

mysql> insert testaa values (6,”,NULL);
ERROR 1048 (23000): Column ‘c’ cannot be null

mysql> select * from testaa;

+—+——+—-+

| a | b | c |

+—+——+—-+

| 1 | aa | |

| 2 | | |

| 3 | NULL | |

| 4 | NULL | |

| 5 | aafa | fa |

+—+——+—-+

查詢驗證過程:

mysql> select * from testaa where c is not null;

+—+——+—-+

| a | b | c |

+—+——+—-+

| 1 | aa | |

| 2 | | |

| 3 | NULL | |

| 4 | NULL | |

| 5 | aafa | fa |

+—+——+—-+

5 rows in set (0.00 sec)

mysql> select * from testaa where c <> ”;

+—+——+—-+

| a | b | c |

+—+——+—-+

| 5 | aafa | fa |

+—+——+—-+

1 row in set (0.00 sec)

mysql> select * from testaa where c = ”;

+—+——+—+

| a | b | c |

+—+——+—+

| 1 | aa | |

| 2 | | |

| 3 | NULL | |

| 4 | NULL | |

+—+——+—+

4 rows in set (0.00 sec)

mysql> select * from testaa where c is null;

Empty set (0.00 sec)

mysql> select * from testaa where b is not null;

+—+——+—-+

| a | b | c |

+—+——+—-+

| 1 | aa | |

| 2 | | |

| 5 | aafa | fa |

+—+——+—-+

3 rows in set (0.00 sec)

mysql> select * from testaa where b <> ”;

+—+——+—-+

| a | b | c |

+—+——+—-+

| 1 | aa | |

| 5 | aafa | fa |

+—+——+—-+

2 rows in set (0.00 sec)

mysql> select * from testaa where b =”;

+—+——+—+

| a | b | c |

+—+——+—+

| 2 | | |

+—+——+—+

1 row in set (0.00 sec)

mysql> select * from testaa where b is null;

+—+——+—+

| a | b | c |

+—+——+—+

| 3 | NULL | |

| 4 | NULL | |

+—+——+—+

mysql> select length(b),length(c) from testaa;
+———–+———–+
| length(b) | length(c) |
+———–+———–+
| 2 | 0 |
| 0 | 0 |
| NULL | 0 |
| NULL | 0 |
| 4 | 2 |
+———–+———–+
5 rows in set (0.00 sec)

mysql> select count(b),count(c) from testaa;
+———-+———-+
| count(b) | count(c) |
+———-+———-+
| 3 | 5 |
+———-+———-+
1 row in set (0.00 sec)

mysql> create table testbb ( a int primary key , b timestamp);
Query OK, 0 rows affected (0.07 sec)

mysql> show create table testbb;
+——–+——————————————————————————————————————————————————————————————+
| Table | Create Table |
+——–+——————————————————————————————————————————————————————————————+
| testbb | CREATE TABLE testbb (
a int(11) NOT NULL,
b timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (a)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+——–+——————————————————————————————————————————————————————————————+

mysql> insert into testbb vales (1,null) ;

mysql> insert into testbb values (2,”);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> show warnings;
+———+——+—————————————-+
| Level | Code | Message |
+———+——+—————————————-+
| Warning | 1265 | Data truncated for column ‘b’ at row 1 |
+———+——+—————————————-+

mysql> select * from testbb;
+—+———————+
| a | b |
+—+———————+
| 1 | 2014-08-15 14:32:10 |
| 2 | 0000-00-00 00:00:00 |
+—+———————+
2 rows in set (0.00 sec)

注意事項:

1:在進行count()統計某列的記錄數的時候,如果採用的NULL值,會別系統自動忽略掉,但是空值是會進行統計到其中的。

2: 判斷NULL 用IS NULL 或者 is not null,SQL 語句函式中可以使用ifnull()函式來進行處理,判斷空字元用 =”或者 <>”來進行處理

3: 對於MySQL特殊的注意事項,對於timestamp資料型別,如果往這個資料型別插入的列插入NULL值,則出現的值是當前系統時間。插入空值,則會出現 ‘0000-00-00 00:00:00’

4:對於空值的判斷到底是使用is null 還是 =”要根據實際業務來進行區分。

總結:
**1.SQL中 ” 不佔空間(長度為0)注意引號中間沒有空格不同於 ’ ‘,null是佔有空間的。
2.”不同於null,當查詢!=”時結果會返回該欄位中既不為”的也不等於null的欄位結果
3.當查詢 is not null 結果只返回不為null的欄位 ” 欄位照樣會顯示出來
4.當查詢is null欄位時結果只匹配為null的對應欄位,當查詢=”也只匹配欄位為”的欄位**

文章轉自:http://www.cnblogs.com/wzmenjoy/p/4244590.html