1. Tổng quan về Kiểu dữ liệu ENUM
Kiểu dữ liệu ENUM là gì?
Kiểu dữ liệu ENUM (enumeration) của MySQL lưu trữ chính xác một giá trị từ một danh sách đã định nghĩa trước. Vì chỉ các chuỗi cụ thể được định nghĩa trong danh sách mới có thể được lưu vào cột, nó giúp duy trì tính nhất quán của dữ liệu và ngăn ngừa việc nhập dữ liệu không hợp lệ.
Ví dụ, khi người dùng phải chọn một tùy chọn trong một tập hợp hạn chế như giới tính hoặc danh mục sản phẩm, việc sử dụng ENUM loại bỏ nhu cầu kiểm tra xác thực không cần thiết. Dưới đây là một ví dụ về việc tạo một bảng có chứa cột ENUM:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
category ENUM('Food', 'Clothing', 'Electronics', 'Furniture') NOT NULL
);
Trong ví dụ này, cột “category” chỉ có thể lưu một trong bốn giá trị sau: “Food”, “Clothing”, “Electronics” hoặc “Furniture”. Điều này đơ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 dữ liệu ENUM chủ yếu được sử dụng trong các kịch bản sau:
- Quản lý trạng thái : Đánh số các trạng thái tiến độ dự án như “Not Started”, “In Progress” và “Completed”.
- Phân loại : Quản lý các tùy chọn danh mục đã định nghĩa trước như sản phẩm, loại người dùng hoặc vai trò công việc.
- Xếp hạng : Các mức độ khó của trò chơi (“Beginner”, “Intermediate”, “Advanced”) hoặc đánh giá sản phẩm (“Good”, “Average”, “Poor”).
2. Ưu và nhược điểm của ENUM
Ưu điểm
- Cải thiện tính toàn vẹn dữ liệu Với ENUM, chỉ các giá trị có trong danh sách đã định nghĩa trước mới có thể được lưu, đảm bảo tính nhất quán của dữ liệu và làm cho việc quản lý dễ dàng hơn. Ví dụ, khi quản lý giới tính, chỉ các giá trị cụ thể như “Male” hoặc “Female” được cho phép, ngăn ngừa việc nhập sai.
- Hiệu quả lưu trữ Mỗi giá trị ENUM được gán một chỉ mục số nguyên nội bộ, nghĩa là các giá trị được lưu dưới dạng số nguyên. So với VARCHAR, điều này giảm lượng bộ nhớ sử dụng. Ví dụ, lưu thông tin kích thước như ‘small’ hoặc ‘large’ bằng VARCHAR tiêu tốn nhiều bộ nhớ hơn, trong khi định nghĩa chúng bằng ENUM cho phép lưu trữ hiệu quả hơn.
Nhược điểm
- Thiếu tính linh hoạt Vì ENUM chỉ cho phép các giá trị đã định nghĩa trước, việc thêm giá trị mới đòi hỏi phải thay đổi cấu trúc bảng. Do đó, nó không phù hợp với các kịch bản mà các tùy chọn thường xuyên thay đổi một cách động.
- Xử lý lỗi phức tạp Nếu một giá trị không hợp lệ được chèn vào, có thể xảy ra lỗi hoặc một chuỗi rỗng sẽ được lưu. Hành vi này có thể làm phức tạp việc gỡ lỗi cho các nhà phát triển.
3. Cấu hình và ví dụ sử dụng ENUM
Cài đặt cơ bản và xử lý lỗi
Việc thiết lập kiểu dữ liệu ENUM chỉ đơn giản là chỉ định danh sách các chuỗi được phép. Dưới đây là một ví dụ về việc định nghĩa một cột ENUM trong một bảng:
CREATE TABLE shirts (
id INT AUTO_INCREMENT PRIMARY KEY,
size ENUM('XS', 'S', 'M', 'L', 'XL') NOT NULL
);
Trong trường hợp này, cột “size” chỉ có thể lưu một trong năm giá trị: “XS”, “S”, “M”, “L” hoặc “XL”. Nếu bạn cố gắng chèn một giá trị không có trong danh sách (ví dụ, ‘XXL’), lỗi Data truncated sẽ xảy ra. Điều này ngăn các giá trị ngoài danh sách đã định nghĩa được lưu và giúp duy trì tính nhất quán của dữ liệu.
Ví dụ thực tế
Tiếp theo, đây là một ví dụ về việc sử dụng ENUM để quản lý các vai trò người dùng (“Administrator”, “Regular User”, “Guest”):
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
role ENUM('Administrator', 'Regular User', 'Guest') NOT NULL
);
Khi gán các quyền khác nhau dựa trên vai trò, việc sử dụng cột ENUM giúp dễ dàng duy trì tính toàn vẹn dữ liệu. 
4. Chỉ mục ENUM và xử lý NULL
Sử dụng giá trị chỉ mục
Mỗi giá trị ENUM được gán một chỉ mục số bắt đầu từ 1 dựa trên vị trí của nó trong danh sách. Ví dụ, hãy xem cột ENUM sau lưu thông tin kích thước:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
size ENUM('S', 'M', 'L', 'XL')
);
“S” được gán chỉ số 1, “M” chỉ số 2, và cứ tiếp tục như vậy. Các giá trị chỉ số này cũng có thể được sử dụng trong các điều kiện WHERE để thực hiện các hoạt động dữ liệu hiệu quả.
SELECT * FROM products WHERE size = 2;
Truy vấn này lấy các bản ghi nơi kích thước là “M”.
Xử lý NULL và Chuỗi Rỗng
Nếu NULL được phép trong một cột ENUM, các giá trị NULL có thể được lưu trữ ngay cả khi chúng không nằm trong danh sách được định nghĩa trước. Ngoài ra, nếu dữ liệu không hợp lệ được chèn và chuyển đổi thành chuỗi rỗng, nó sẽ được lưu trữ với chỉ số 0. Hành vi này làm cho việc phát hiện đầu vào không chính xác trở nên khả thi.
5. Bộ Ký Tự và Quy Tắc Sắp Xếp trong ENUM
Cách Cấu Hình Bộ Ký Tự và Quy Tắc Sắp Xếp
Giống như CHAR và VARCHAR, kiểu dữ liệu ENUM cho phép bạn chỉ định bộ ký tự và quy tắc sắp xếp. Điều này đặc biệt quan trọng khi xây dựng các hệ thống đa ngôn ngữ hoặc thực hiện các tìm kiếm phụ thuộc vào quy tắc sắp xếp. Dưới đây là một ví dụ:
CREATE TABLE documents (
id INT AUTO_INCREMENT PRIMARY KEY,
language ENUM('Japanese', 'English', 'Chinese') CHARACTER SET utf8 COLLATE utf8_general_ci
);
Trong ví dụ này, bộ ký tự UTF-8 và một quy tắc sắp xếp chung được chỉ định.
6. Khả Năng Mở Rộng và Các Lựa Chọn Thay Thế cho ENUM
Chiến Lược Mở Rộng ENUM
Vì ENUM thiếu tính linh hoạt để lưu trữ các giá trị tùy ý, nó không phù hợp cho dữ liệu thay đổi động. Một cách tiếp cận là thêm tùy chọn “Other” và cung cấp một cột văn bản tự do riêng biệt:
ALTER TABLE products
MODIFY COLUMN category ENUM('Food', 'Clothing', 'Electronics', 'Furniture', 'Other') NOT NULL,
ADD COLUMN category_other VARCHAR(255) DEFAULT NULL;
Bằng cách này, các giá trị không nằm trong danh sách ENUM có thể được lưu trữ trong một cột VARCHAR riêng biệt, cho phép xử lý động khi cần thiết.
Sử Dụng SET hoặc VARCHAR Làm Các Lựa Chọn Thay Thế
Là các lựa chọn thay thế cho ENUM, bạn có thể xem xét kiểu dữ liệu SET (cho phép chọn nhiều) hoặc kiểu dữ liệu VARCHAR linh hoạt hơn, tùy thuộc vào yêu cầu ứng dụng của bạn.


