Null

何時使用 NULL 以及何時使用空字元串?

  • December 5, 2021

我主要對 MySQL 和 PostgreSQL 感興趣,但您一般可以回答以下問題:

  • 是否存在將空字元串與 NULL 區分開來的邏輯場景?

  • 將空字元串儲存為…的物理儲存含義是什麼?

    • 空值?
    • 空字元串?
    • 另一個領域?
    • 還有什麼辦法嗎?

假設記錄來自收集姓名和地址資訊的表單。如果使用者不住在公寓裡,地址的第 2 行通常為空白。在這種情況下,空字元串是完全有效的。我傾向於使用 NULL 來表示該值未知或未給出。

我不相信物理儲存差異在實踐中值得擔心。作為數據庫管理員,我們有更大的魚可炒!

我不了解 MySQL 和 PostgreSQL,但讓我概括一下。

有一個 DBMS,即 Oracle,它不允許在 NULL 和 ’’ 之間選擇它的使用者。這清楚地表明沒有必要區分兩者。有一些煩人的後果:

您將 varchar2 設置為一個空字元串,如下所示:

Update mytable set varchar_col = '';

以下導致相同的結果

Update mytable set varchar_col = NULL;

但是要選擇值為空或 NULL 的列,您必須使用

select * from mytable where varchar_col is NULL;

使用

select * from mytable where varchar_col = '';

在語法上是正確的,但它永遠不會返回一行。

另一方面,在 Oracle 中連接字元串時。NULL varchars 被視為空字元串。

select NULL || 'abc' from DUAL;

產生abc。在這些情況下,其他 DBMS 將返回 NULL。

當你想明確表達一個值被賦值時,你必須使用像’‘這樣的東西。

而且您必須擔心修剪不為空是否會導致 NULL

select case when ltrim(' ') is null then 'null' else 'not null' end from dual

確實如此。

現在看看 ’’ 與 NULL 不同的 DBMS(例如 SQL-Server)

使用 ’’ 通常更容易,並且在大多數情況下,實際上不需要區分兩者。我知道的一個例外情況是,當您的列代表某些設置並且您沒有為它們設置空預設值時。當您可以區分 ’’ 和 NULL 時,您可以表示您的設置為空並避免應用預設值。

引用自:https://dba.stackexchange.com/questions/59