1. 簡介
MySQL 是一個開源的 RDBMS,對許多開發者來說是資料庫管理的主要選擇。其中,BOOLEAN 型別是一種常用來表示真偽值的資料型別。然而,MySQL 中對 BOOLEAN 型別的處理方式與其他資料庫系統不同,因此需要特別注意。本文將詳細說明 MySQL 中 BOOLEAN 型別的基本使用方式、限制以及替代方案。
2. BOOLEAN 型別的基礎
2.1 BOOLEAN 型別的定義與 MySQL 的實作
在 MySQL 中,BOOLEAN 型別並非真正存在,而是以 TINYINT(1) 來取代。BOOLEAN 是 TINYINT(1) 的別名,內部會將 0 視為 FALSE、1 視為 TRUE。因此,定義為 BOOLEAN 的欄位實際上可以存放 0 到 255 的整數值,但其中的 0 與 1 才會被識別為布林值。
2.2 使用 TINYINT(1) 的原因
MySQL 以 TINYINT(1) 取代 BOOLEAN 的原因在於維持整體效能與相容性。TINYINT 是一個僅佔 1 位元組的整數型別,能有效率地使用資料庫的儲存空間與記憶體。此外,TINYINT 與 MySQL 其他數值型別能以統一的方式處理,確保系統一致性。
2.3 0 與 1 的對應
MySQL 中的 BOOLEAN 型別透過 0 與 1 表示 FALSE 與 TRUE,這與許多程式語言處理邏輯值的方式相似。因此,在操作資料庫時,可以用 0 和 1 代替 TRUE 與 FALSE。但需注意,BOOLEAN 欄位仍可插入其他整數值。

3. BOOLEAN 型別的使用範例
3.1 在資料表中定義 BOOLEAN 型別
在建立資料表時,可以使用 BOOLEAN 或 TINYINT(1) 來定義欄位。以下範例將 is_active 欄位定義為 BOOLEAN 型別:
CREATE TABLE example_table (
id INT AUTO_INCREMENT PRIMARY KEY,
is_active BOOLEAN
);
在這個例子中,is_active 雖然定義為 BOOLEAN,但內部實際上是以 TINYINT(1) 儲存。
3.2 插入資料的範例(使用 TRUE 與 FALSE)
向 BOOLEAN 欄位插入資料時,可以使用 TRUE 與 FALSE 關鍵字。MySQL 會將 TRUE 轉換為 1,FALSE 轉換為 0。
INSERT INTO example_table (is_active) VALUES (TRUE);
INSERT INTO example_table (is_active) VALUES (FALSE);
3.3 使用 SELECT 查詢 BOOLEAN 型別
在 SELECT 語句中,可以將 BOOLEAN 欄位作為條件使用,但需注意 =
與 IS
運算子的差異。
-- 使用 = 運算子
SELECT * FROM example_table WHERE is_active = TRUE;
-- 使用 IS 運算子
SELECT * FROM example_table WHERE is_active IS TRUE;
使用 =
運算子時,只有 1 與 0 會被識別為 TRUE 與 FALSE;但使用 IS
運算子時,除了 0 外的其他數字也會被當作 TRUE。
4. BOOLEAN 型別的限制與注意事項
4.1 作為 TINYINT(1) 別名的限制
由於 BOOLEAN 實際上是 TINYINT(1) 的別名,因此它能存放 0 到 255 的整數值,也就是說可以插入非 0 與 1 的數值。為了維持資料一致性,建議在插入資料時進行驗證。
4.2 NULL 值與 NOT NULL 設定
BOOLEAN 欄位預設允許 NULL 值,若不希望允許 NULL,需在定義時加上 NOT NULL。
CREATE TABLE example_table (
id INT AUTO_INCREMENT PRIMARY KEY,
is_active BOOLEAN NOT NULL
);
在這個例子中,is_active 欄位就不能插入 NULL 值。
4.3 與標準 SQL 的差異
MySQL 對 BOOLEAN 的處理方式與標準 SQL 或其他資料庫不同。許多資料庫系統原生支援 BOOLEAN 型別,僅允許 TRUE 與 FALSE。但 MySQL 是以 TINYINT(1) 模擬,因此在系統遷移時需格外注意。

5. BOOLEAN 型別的替代方案
5.1 使用 ENUM 進行更嚴格的型別檢查
若需要更嚴格的型別控制,可以使用 ENUM。透過 ENUM 可以限制欄位只能存放特定值。
CREATE TABLE example_table (
id INT AUTO_INCREMENT PRIMARY KEY,
is_active ENUM('FALSE', 'TRUE') NOT NULL
);
此方法下,is_active 欄位只能存放 ‘TRUE’ 或 ‘FALSE’,不允許其他值。
5.2 ENUM 作為 BOOLEAN 替代方案的實例
使用 ENUM 可在確保資料一致性的同時管理真偽值。但需注意,ENUM 是以字串存放,相較於 TINYINT(1) 的 BOOLEAN 型別,儲存效率會較低。因此需依應用需求選擇合適的型別。
6. BOOLEAN 型別的使用情境與最佳實務
6.1 適合使用 BOOLEAN 型別的情境
BOOLEAN(或 TINYINT(1))常用於旗標或開關狀態,例如用於標示使用者是否啟用、商品是否有庫存等僅需二值(True/False)的資料。
6.2 為 BOOLEAN 欄位建立索引
BOOLEAN 欄位建立索引後,能提升查詢效能。但效果會受到欄位值分布影響,例如大多數值為 TRUE 時,索引的效益會有限。
6.3 維持資料一致性的最佳實務
在使用 BOOLEAN 時,建議遵循以下實務:
- 若不允許 NULL 值,需在定義時加上 NOT NULL。
- 插入資料時需驗證,避免非 0 與 1 的值。
- 可考慮使用 ENUM 來強化型別檢查。
7. 總結
正確理解並使用 MySQL 的 BOOLEAN 型別,對資料庫設計與應用程式開發都非常重要。BOOLEAN 實際上是以 TINYINT(1) 模擬,可能存放任意整數,因此需謹慎處理。若需要更嚴格的型別檢查,可考慮使用 ENUM。