淺談資料庫字串型別的處理方式
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 時的複雜度。 - 避免運算異常:避免
NULL在NOT IN或AND/OR條件運算中產生預期外的結果。
缺點則在於當 Foreign Key 為字串型別時,若無值必須存 NULL,會導致該欄位處理邏輯與其他字串欄位不一致。
建議做法
在沒有特定框架或團隊規範限制下,建議將字串欄位設為 NOT NULL 並存儲空字串,以規避 NULL 帶來的邏輯風險。若遇到字串型態的 Foreign Key,則需妥協使用 NULL,並盡量避免將字串作為 Foreign Key。
異動歷程
- 2024-07-12 初版文件建立。
