使用 MySQL 原生 ENUM 型別,在資料庫層面強制限制合法值:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
gender ENUM('boy', 'girl') NOT NULL DEFAULT 'boy'
);
INSERT ... gender='boy' 成功;gender='other' → 報錯 Data truncated for column 'gender' (嚴格模式) 或存入空字串 (非嚴格模式)。SELECT gender FROM users 直接回傳字串 'boy'/'girl'。'boy' < 'girl'),非字母序。sql_mode 包含 STRICT_TRANS_TABLES,讓非法值直接拋錯而非靜默截斷。'other',執行 ALTER TABLE users MODIFY gender ENUM('boy','girl','other') (瞬間完成,無需重寫資料)。enum Gender { BOY, GIRL },透過 ORM (MyBatis, Hibernate, JPA) 自動映射,雙重保障。| 方案 | 優點 | 缺點 |
|---|---|---|
| ENUM | 資料庫原生約束、儲存小、查詢快 | 修改值需 DDL、跨資料庫移植性差 |
| CHECK 條件約束 (MySQL 8.0.16+) | 標準 SQL、彈性 | 舊版不支援、效能略低 |
| 外鍵關聯 gender_dict 表 | 完全正規化、易擴充 | 需 JOIN、額外儲存空間 |
| 應用層驗證 (VARCHAR + 程式檢查) | 簡單、無資料庫依賴 | 繞過程式直連 DB 時失效 |
**建議**:單純雙值且極少變動 → **ENUM** 最簡潔高效;需頻擴充或跨異構資料庫 → **查找表 + 外鍵**。