mysql中null與「空值」的坑

字段屬性的"空值"與"NULL"不同html

相信不少用了MySQL好久的人,對這兩個字段屬性的概念還不是很清楚,通常會有如下疑問:mysql

一、我字段類型是not null,爲何我能夠插入空值

二、爲毛not null的效率比null高

三、判斷字段不爲空的時候,到底要  select * from table where column <> '' 仍是要用 select * from table where column is not null 呢。

帶着上面幾個疑問,咱們來深刻研究一下null 和 not null 到底有什麼不同。linux

空值」 和 「NULL」 的概念sql

首先,咱們要搞清楚「空值」 和 「NULL」 的概念:app

一、空值是不佔用空間的測試

二、mysql中的NULL實際上是佔用空間的,下面是來自於MYSQL官方的解釋ui

「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.」spa

PS:打個比方來講,你有一個杯子,空值表明杯子是真空的,NULL表明杯子中裝滿了空氣,雖然杯子看起來都是空的,可是區別是很大的。.net

實驗測試"空值"和"NULL"的區別rest

CREATE TABLE  `test` (  
 `col1` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,  
 `col2` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL  
) ENGINE = MYISAM ;

插入數據:

INSERT INTO `test` VALUES (null,1);

mysql發生錯誤:

#1048 - Column 'col1' cannot be null

再來一條

INSERT INTO `test` VALUES ('',1);

成功插入數據,可見,NOT NULL 的字段是不能插入「NULL」的,只能插入「空值」,上面的問題1也就有答案了。

對於問題2,上面咱們已經說過了,NULL 其實並非空值,而是要佔用空間,因此mysql在進行比較的時候,NULL 會參與字段比較,因此對效率有一部分影響,並且B樹索引時不會存儲NULL值的,因此若是索引的字段能夠爲NULL,索引的效率會降低不少。
咱們再向test的表中插入幾條數據:

INSERT INTO `test` VALUES ('', NULL);  
INSERT INTO `test` VALUES ('1', '2');

如今表中數據:

mysql中null與「空值」的坑mysql中null與「空值」的坑

如今根據需求,我要統計test表中col1不爲空的全部數據,我是該用「<> ''」 仍是 「IS NOT NULL」 呢,讓咱們來看一下結果的區別。

SELECT * FROM `test` WHERE col1 IS NOT NULL

mysql中null與「空值」的坑mysql中null與「空值」的坑

能夠看到,結果迥然不一樣,因此咱們必定要根據業務需求,搞清楚究竟是要用那種搜索條件。

"is not null " 和 "!=null"

在篩選非空的字段常常會用到"is not null"和"!=null",可是這兩種方法是不同的!!!!
Why?????而"null" 表示什麼也不是, 用「=、>、< ...」 全部的判斷,結果都是false,全部只能用 is null進行判斷。默認狀況下,推薦使用 IS NOT NULL去判斷,由於SQL默認狀況下對。"!= Null"的判斷會永遠返回0行,但沒有語法錯誤。若是你必定想要使用"!= Null"來判斷,須要加上這個語句:「set ANSI_NULLS off」這時你會發現「IS NOT NULL」 和 「!= null」 是等效的。

原文來自:http://blog.csdn.net/fwkjdaghappy1/article/details/7703974

本文地址:http://www.linuxprobe.com/mysql-null-vs-not-null.html

相關文章
相關標籤/搜索