MySQL字段null和not null學習思考

最近,在開發過程中,建表的時候有個涉及到時間的字段。開始時,使用了not null,default值爲0000-00-00 00:00:00。但是有個同事說,這個值很有可能不存在,只有部分情況下才會存在,應當使用null,節省空間。開始時,使用not null的原因也是因爲之前的一位前輩說數據庫建表時,所有字段儘量爲not null,並且設默認值。然後通過代碼保證。因此有重新查閱博客文檔瞭解其原因。

最後的理解是:mysql所有字段儘可能使用not null。最終時間默認值設爲1970-01-01 08:00:00,使用這個的原因是該時間對應的時間戳是0。擔心萬一有用到時間戳的地方,0000-00-00 00:00:00對應的時間戳是一個負數。

對於MYSQL特殊的注意事項,對於timestamp數據類型,如果往這個數據類型插入的列插入NULL值,則出現的是當前系統時間,插入空值,則出現0000-00-00 00:00:00。

除非有特別的原因使用NULL值,應該總是讓字段保持not null。

空值跟NULL是兩個概念

(1)空值不佔用空間

(2)MYSQL中NULL其實是佔用空間的。

在數據庫裏是嚴格區分的,任何數跟NULL進行運算都是NULL, 判斷值是否等於NULL,不能簡單用=,而要用IS NULL關鍵字。SQL語句函數中可以使用ifnull()哈數進行處理,判斷空字符串用=''或者<>''來進行處理

含有空值的列很難進行查詢優化,而且對錶索引時不會存儲NULL值的,所以如果索引字段可以爲NULL,索引的效率會下降很多,因爲它們使得索引、索引的統計信息以及比較運算更加複雜。你應該用0、一個特殊值或者一個空串代替NULL。(影響索引效率的原因:NULL不是空值,而是要佔用空間,所以MYSQL進行比較的時候,NULL會參與字段比較,所以對效率有一部分影響。且B樹索引不會存儲NULL值的,所以如果索引的字段可以爲NULL,索引的效率會下降很多。)

聯表查詢的時候,例如LEFT JOIN table2,如果沒有記錄,則查找出的table2字段都是NULL,加入table2有些字段本身可以是null,那麼除非把table2中not null中的字段查出來,否則就難以區分到底是沒有關聯記錄還是其他情況

數據庫的字段設置NOT NULL,僅僅說明該字段不能爲NULL,只有在插入數據爲NULL的情況下會報錯。

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


MYSQL NULL特殊的影響和使用:https://opensource.actionsky.com/20190710-mysql/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章