Null
何時使用 NULL 以及何時使用空字元串?
我主要對 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 時,您可以表示您的設置為空並避免應用預設值。