1. Tổng quan về Kiểu ENUM
Kiểu ENUM là gì?
Kiểu ENUM (enumeration) trong MySQL là một kiểu dữ liệu lưu trữ một giá trị duy nhất từ một danh sách đã được định nghĩa trước. Vì chỉ có các chuỗi đã định nghĩa mới có thể được lưu trong cột, nên nó đảm bảo tính nhất quán của dữ liệu và ngăn chặn các giá trị không hợp lệ được chèn vào.
Ví dụ, khi người dùng chọn một tùy chọn trong các lựa chọn có hạn như giới tính hoặc danh mục sản phẩm, việc sử dụng kiểu ENUM loại bỏ nhu cầu kiểm tra lỗi phức tạp. Dưới đây là ví dụ tạo bảng có cột ENUM:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
category ENUM('食品', '衣料品', '家電', '家具') NOT NULL
);
Trong ví dụ này, cột category chỉ có thể lưu một trong các giá trị sau: “食品”, “衣料品”, “家電”, hoặc “家具”. Điều này giúp đơn giản hoá việc quản lý dữ liệu và giảm rủi ro nhập sai.
Các trường hợp sử dụng chính của ENUM
Kiểu ENUM thường được dùng trong các kịch bản như:
- Quản lý trạng thái : Theo dõi các giai đoạn công việc như “未開始”, “進行中”, hoặc “完了”.
- Định nghĩa danh mục : Quản lý các tùy chọn đã định nghĩa trước như danh mục sản phẩm, loại người dùng, hoặc vị trí công việc.
- Xếp hạng hoặc nhóm cấp độ : Mức độ khó trong trò chơi (“初級”, “中級”, “上級”) hoặc đánh giá sản phẩm (“良い”, “普通”, “悪い”).
2. Ưu và Nhược điểm của ENUM
Ưu điểm
- Cải thiện tính nhất quán dữ liệu ENUM chỉ cho phép các giá trị có trong danh sách đã định nghĩa, giúp xử lý dữ liệu đồng nhất. Ví dụ, khi quản lý giới tính, chỉ các giá trị đã định như “男性” hoặc “女性” được chấp nhận, ngăn chặn nhập liệu sai.
- Tiết kiệm không gian lưu trữ Mỗi giá trị ENUM được lưu nội bộ dưới dạng chỉ mục số nguyên. Do đó, nó tiêu tốn ít không gian hơn so với VARCHAR. Ví dụ, các giá trị như ‘small’ hoặc ‘large’ sẽ chiếm nhiều không gian nếu dùng VARCHAR, nhưng ENUM lưu chúng hiệu quả bằng các chỉ mục số.
Nhược điểm
- Thiếu tính linh hoạt Các giá trị ENUM là cố định. Thêm tùy chọn mới đòi hỏi phải thay đổi cấu trúc bảng, khiến ENUM không phù hợp với các bộ dữ liệu thay đổi thường xuyên.
- Xử lý lỗi phức tạp Nếu chèn một giá trị không hợp lệ, MySQL có thể sinh ra lỗi hoặc lưu một chuỗi rỗng. Điều này có thể làm khó khăn trong việc gỡ lỗi cho nhà phát triển.
3. Cấu hình ENUM và Ứng dụng Thực tế
Cài đặt Cơ bản và Xử lý Lỗi
Để cấu hình một kiểu ENUM, chỉ cần định nghĩa danh sách các chuỗi hợp lệ. Ví dụ sau định nghĩa một cột ENUM trong bảng:
CREATE TABLE shirts (
id INT AUTO_INCREMENT PRIMARY KEY,
size ENUM('XS', 'S', 'M', 'L', 'XL') NOT NULL
);
Ở đây, cột size chỉ chấp nhận “XS”, “S”, “M”, “L”, hoặc “XL”. Cố gắng chèn một giá trị không có trong danh sách (ví dụ, ‘XXL’) sẽ gây ra lỗi Data truncated. Điều này ngăn chặn dữ liệu không hợp lệ và duy trì tính nhất quán.
Ví dụ Ứng dụng Thực tế
Ví dụ dưới đây sử dụng ENUM để quản lý vai trò người dùng như “管理者”, “一般ユーザー”, và “ゲスト”:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
role ENUM('管理者', '一般ユーザー', 'ゲスト') NOT NULL
);
Việc sử dụng cột ENUM giúp duy trì quyền truy cập và kiểm soát dựa trên vai trò một cách nhất quán.

4. Đánh chỉ mục và Xử lý NULL với ENUM
Sử dụng Chỉ mục
Các giá trị ENUM được gán chỉ mục số nguyên dựa trên vị trí của chúng trong danh sách. Ví dụ:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
size ENUM('S', 'M', 'L', 'XL')
);
“S” có chỉ mục 1, “M” chỉ mục 2, v.v. Các chỉ mục này có thể được dùng trong các mệnh đề WHERE:
SELECT * FROM products WHERE size = 2;
Truy vấn này sẽ lấy các bản ghi có kích thước tương ứng với “M”.
Xử lý NULL và Chuỗi Rỗng
Nếu cho phép NULL, cột có thể lưu NULL như một trạng thái hợp lệ ngay cả khi không có trong danh sách ENUM. Ngoài ra, dữ liệu không hợp lệ được chèn dưới dạng chuỗi rỗng sẽ được lưu với chỉ mục 0, giúp phát hiện nhanh các nhập liệu sai.
5. Bộ ký tự và Collation cho ENUM
Cách Đặt Bộ Ký Tự và Collation
ENUM, giống như CHAR hoặc VARCHAR, hỗ trợ định nghĩa bộ ký tự và collation. Điều này quan trọng khi xử lý dữ liệu đa ngôn ngữ hoặc các thao tác sắp xếp. Ví dụ:
CREATE TABLE documents (
id INT AUTO_INCREMENT PRIMARY KEY,
language ENUM('日本語', '英語', '中国語')
CHARACTER SET utf8
COLLATE utf8_general_ci
);
Ví dụ này chỉ định UTF-8 và một collation chung.
6. Mở rộng ENUM và Các lựa chọn thay thế
Kỹ thuật mở rộng ENUM
Vì ENUM thiếu tính linh hoạt cho các giá trị động, bạn có thể bao gồm một tùy chọn “Khác” và lưu đầu vào tự do trong một cột riêng:
ALTER TABLE products
MODIFY COLUMN category ENUM('食品', '衣料品', '家電', '家具', 'その他') NOT NULL,
ADD COLUMN category_other VARCHAR(255) DEFAULT NULL;
Điều này cho phép lưu các giá trị không có trong danh sách ENUM trong khi vẫn duy trì cấu trúc.
Các kiểu dữ liệu thay thế: SET hoặc VARCHAR
Tùy thuộc vào yêu cầu, các lựa chọn thay thế bao gồm:
- Kiểu SET : Lưu nhiều lựa chọn từ một danh sách.
- VARCHAR : Cung cấp độ linh hoạt tối đa mà không có ràng buộc định trước.


