筆記目錄

Skip to content

淺談資料庫字串型別的處理方式

TLDR

  • 處理資料庫字串時,常見策略包含:區分 NULL 與空字串、一律存 NULL、一律設為 NOT NULL 並存空字串。
  • 區分 NULL 與空字串具有較佳的語意表達能力,但缺乏強制性,需仰賴開發人員謹慎處理。
  • Oracle 資料庫會自動將空字串轉換為 NULL,具備強制一致性。
  • 使用 NOT NULL 搭配空字串可避免 IS NULL 語法判斷問題,並減少 NULL 在條件運算中產生的預期外結果。
  • NULL 可能導致索引效能問題或 NOT IN 查詢異常,使用空字串可規避此類風險。
  • 建議在無特殊規範下,優先將字串欄位設為 NOT NULL 並存空字串,但需注意 Foreign Key 欄位必須允許 NULL 的限制。

區分 NULL 和空字串

什麼情況下會遇到這個問題:當業務邏輯需要明確區分「未曾輸入資料」與「輸入了空值」時。

此做法將 NULL 定義為未曾輸入資料,空字串則為已輸入但值為空。其優點在於語意明確,但缺點是缺乏資料庫層級的強制性,開發人員必須在程式碼中嚴格控管兩者的使用情境。

一律存 NULL

什麼情況下會遇到這個問題:使用 Oracle 資料庫,或希望資料庫層級強制統一格式時。

Oracle 資料庫在儲存空字串時會自動轉換為 NULL,確保資料的一致性。若在其他資料庫系統中採用此策略,通常需要搭配 CHECK 約束來強制執行。

一律設 NOT NULL 並存空字串

什麼情況下會遇到這個問題:為了簡化 SQL 查詢邏輯、避免 NULL 帶來的運算陷阱,或優化索引效能時。

此策略的優點如下:

  • 強制性:欄位設為 NOT NULL 可強制使用者僅能存入空字串。
  • 索引效能:在部分資料庫中,空字串的索引處理效能優於 NULL。需注意 NULL 有時無法有效利用索引,例如 SQL Server 在使用 IS NULL 述詞時,篩選索引可能無法發揮作用。
  • 簡化查詢:避免在 SQL 中使用 IS NULL 判斷,減少程式自動產生 SQL 時的複雜度。
  • 避免運算異常:避免 NULLNOT INAND/OR 條件運算中產生預期外的結果。

缺點則在於當 Foreign Key 為字串型別時,若無值必須存 NULL,會導致該欄位處理邏輯與其他字串欄位不一致。

建議做法

在沒有特定框架或團隊規範限制下,建議將字串欄位設為 NOT NULL 並存儲空字串,以規避 NULL 帶來的邏輯風險。若遇到字串型態的 Foreign Key,則需妥協使用 NULL,並盡量避免將字串作為 Foreign Key。

異動歷程

  • 2024-07-12 初版文件建立。