快速理解MySQL null的10大坑

小松聊PHP进阶發表於2024-05-19

建立表時應當設定not null,新增一個預設值0或''去替代null。

sum('field')的坑

若一列的所有值都是null,那麼sum函式的結果不是0,而是null,所以可能會因為值的型別相容問題,出現意料之外的情況。
null值會有NPE問題。

count('field')的坑

有null的列,count不會+1。

where('field')的坑

null是沒有設定值的一種狀態,並不是某個值,若用where field = null, where field = '', where field = false, where field = true,都無法匹配。
需要使用where field is null,where field <=> null來匹配。

group by('field')的坑

null值會被自動歸類為一類,某些場景下,可能不適用。

order by('field')的坑

null值會被視為最小值,放在0的前方,某些場景下,可能不適用。

distinct('field')的坑

有null的值,也會被去重,某些場景下,可能不適用。

null相關運算的坑

null值與任何資料進行四則運算或者大於小於等於不等於的運算,都返回null,某些場景下,可能不適用。

匯入資料的坑

若兩個MySQL環境或配置不一樣,A裝置匯出的資料,B裝置匯入,可能會因為null值所在的欄位缺少值從而報錯。

外來鍵的坑

在 MySQL 中,如果使用了外來鍵約束,並且外來鍵列允許 NULL 值,那麼當引用的列中出現 NULL 值時,可能會導致一些意想不到的行為,如無法正確匹配行或者導致級聯更新或刪除的問題。

結果相容性的坑

對於靜態強型別語言,可能型別上會不相容。
對於動態若型別的語言,null,0,false,'',都是false,可能會影響一些邏輯。

對唯一索引的影響

null值會導致資料有多個相同的null值,破壞了唯一性約束。

對索引的影響

有的說null值就不走索引,經過實測,就算全是null值,也顯示的Using index。

相關文章