MySQL ENUM 型完整指南|使用方法、優點與注意事項徹底解析

1. ENUM 型概述

ENUM 型是什麼

MySQL 的 ENUM(列舉)型是一種只能從預先定義的清單中選取一個值來儲存的資料型別。由於欄位只能保存清單中指定的特定字串,能夠保持資料的一致性,並防止無效資料的輸入。 例如,當使用者在性別或商品類別等有限的選項中選擇一項時,使用 ENUM 型可以省去不必要的錯誤檢查。以下是包含 ENUM 型欄位的資料表建立範例:
CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    category ENUM('食品', '衣料品', '家電', '家具') NOT NULL
);
在此範例中,「category」欄位只能儲存「食品」「衣料品」「家電」「家具」四個值中的一個。藉此使資料管理變得簡單,並降低錯誤輸入的風險。

ENUM 型的主要用途

ENUM 型主要用於以下情況:
  • 狀態管理:為了管理專案的進度狀況,列舉「未開始」「進行中」「完成」等li>
  • 分類:在管理商品、使用者類型、職位等預先定義的類別選項時使用。
  • 等級劃分:例如遊戲的難度(「初級」「中級」「上級」)或商品的評價(「好」「普通」「差」)等。

2. ENUM 型的優點與缺點

優點

  1. 提升資料的一致性 ENUM 型中,只能儲存列在指定清單中的值,因而資料具備一致性,管理也更容易。例如,若管理性別時,只允許「男性」或「女性」等特定值,便可防止錯誤輸入。
  2. 儲存空間的效率化 ENUM 型會為清單內的每個值分配整數索引,實際上以整數儲存,較之 VARCHAR 型可節省儲存空間。例如,若以 VARCHAR 儲存 ‘small’、’large’ 等尺寸資訊,會消耗較多儲存空間,但透過 ENUM 定義則能有效儲存。

缺點

  1. 缺乏彈性 ENUM 型只能使用固定的選項新增值則需變更資料表結構。因此,不適合選項會動態增加的情況。
  2. 錯誤處理的困難 若插入無效值,可能會發生錯誤或儲存空字串。這會使開發者的除錯變得更複雜。

3. ENUM型的設定與使用範例

基本設定與錯誤處理

ENUM型的設定只需要指定可在列表中儲存的字串。以下是定義資料表中ENUM型欄位的範例:
CREATE TABLE shirts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    size ENUM('XS', 'S', 'M', 'L', 'XL') NOT NULL
);
在此情況下,「size」欄位只能儲存「XS」「S」「M」「L」「XL」五個值中的一個。若嘗試插入不在列表中的值(例如:’XXL’),會發生Data truncated錯誤。這樣可防止儲存不在列表中的值,維持資料的一致性。

實際使用範例

接下來示範使用 ENUM 型來管理使用者的職位(「管理者」「一般使用者」「訪客」)的範例。
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    role ENUM('管理者', '一般使用者', '訪客') NOT NULL
);
若要依職位賦予不同的操作權限,使用 ENUM 型欄位可更容易維持資料的完整性。

4. ENUM型的索引與NULL的處理

索引的使用

ENUM型的值會依照清單的順序從 1 開始分配索引。例如,若有如下儲存尺寸資訊的 ENUM 欄位:
CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    size ENUM('S', 'M', 'L', 'XL')
);
「S」為索引 1,「M」為索引 2… 依此分配。此索引也可以在 WHERE 子句的條件中指定,從而實現高效的資料操作。
SELECT * FROM products WHERE size = 2;
此查詢會取得尺寸為「M。

NULL 與空字元的處理

若允許 ENUM 欄位為 NULL,即使不在清單中也能儲存 NULL 值。此外,若錯誤資料以空字元插入,會以索引 0 儲存,從而辨識錯誤輸入。

5. ENUM 型的字元集與校對順序

字元集與校對順序的設定方法

ENUM 型與 CHAR 或 VARCHAR 相同,可以指定字元集與校對順序。特別是在多語言支援或考慮校對順序的搜尋時非常重要。以下為範例:
CREATE TABLE documents (
    id INT AUTO_INCREMENT PRIMARY KEY,
    language ENUM('日本語', '英語', '中国語') CHARACTER SET utf8 COLLATE utf8_general_ci
);
此範例中,指定了 UTF-8 的字元集與一般的校對順序。

6. ENUM 型的擴充性與替代方案

擴充的技巧

ENUM 型缺乏在欄位中存放自由值的彈性,對於動態變化的資料不適合。在此情況下,可加入「其他」選項,並另設自由輸入欄位:
ALTER TABLE products 
MODIFY COLUMN category ENUM('食品', '衣料品', '家電', '家具', 'その他') NOT NULL,
ADD COLUMN category_other VARCHAR(255) DEFAULT NULL;
如此一來,將不在 ENUM 型中的項目存放於其他 VARCHAR 欄位,便能動態因應。

作為替代資料型別的 SET 型與 VARCHAR 型

作為 ENUM 型的替代方案,考慮能存放多項選擇的 SET 型或更具彈性的 VARCHAR 型也是一個建議。