Hướng dẫn MySQL ENUM: Cách dùng, lợi ích, lưu ý

1. Tổng quan về kiểu ENUM

Kiểu ENUM là gì

Kiểu ENUM (liệt kê) của MySQL là một kiểu dữ liệu cho phép lưu trữ một giá trị duy nhất được chọn từ danh sách đã định nghĩa trước. Vì chỉ có thể lưu các chuỗi ký tự được chỉ định trong danh sách vào cột, nên 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 trong các tùy chọn hạn chế như giới tính hoặc danh mục sản phẩm, việc sử dụng kiểu ENUM có thể loại bỏ các kiểm tra lỗi không cần thiết. Dưới đây là ví dụ tạo bảng có cột kiểu ENUM:
CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    category ENUM('Thực phẩm', 'Quần áo', 'Đồ điện tử', 'Nội thất') NOT NULL
);
Trong ví dụ này, cột “category” có thể lưu một trong bốn giá trị “Thực phẩm”, “Quần áo”, “Đồ điện tử”, “Nội thất”. Điều này giúp việc quản lý dữ liệu trở nên đơn giản hơn và giảm rủi ro nhập sai.

Các mục đích chính của kiểu ENUM

Kiểu ENUM chủ yếu được sử dụng cho các mục đích sau:
  • Quản lý trạng thái: Để quản lý tiến độ dự án, liệt kê các trạng thái như “chưa bắt đầu”, “đang tiến hành”, “hoàn thành”.
  • Phân loại: Sử dụng khi quản lý các tùy chọn danh mục đã được định nghĩa trước như sản phẩm, loại người dùng, chức vụ, v.v.
  • Xếp hạng: Ví dụ như độ khó của trò chơi (“cơ bản”, “trung cấp”, “cao cấp”) hoặc đánh giá sản phẩm (“tốt”, “bình thường”, “xấu”).

2. Lợi ích và nhược điểm của kiểu ENUM

Lợi ích

  1. Cải thiện tính nhất quán dữ liệu Với kiểu ENUM, chỉ có thể lưu các giá trị có trong danh sách đã chỉ định, do đó dữ liệu có tính nhất quán và dễ quản lý hơn. Ví dụ, khi quản lý giới tính, chỉ cho phép các giá trị cụ thể như “Nam” hoặc “Nữ”, giúp ngăn ngừa nhập sai.
  2. Tối ưu hóa lưu trữ Vì mỗi giá trị trong danh sách của kiểu ENUM được gán một chỉ mục số nguyên, nên thực tế nó được lưu dưới dạng số nguyên, tiết kiệm dung lượng lưu trữ so với kiểu VARCHAR. Ví dụ, nếu lưu thông tin kích thước như ‘small’ hoặc ‘large’ bằng VARCHAR, sẽ tiêu tốn nhiều bộ nhớ hơn, nhưng khi định nghĩa bằng ENUM, việc lưu trữ trở nên hiệu quả.

Nhược điểm

  1. Thiếu tính linh hoạt Kiểu ENUM chỉ cho phép sử dụng các lựa chọn cố định, vì vậy khi thêm giá trị mới cần phải thay đổi cấu trúc bảng. Do đó, nó không phù hợp với các trường hợp mà các lựa chọn tăng lên một cách động.
  2. Khó khăn trong xử lý lỗi Khi giá trị không hợp lệ được chèn vào, có thể xảy ra lỗi hoặc chuỗi rỗng được lưu. Điều này có thể làm cho việc gỡ lỗi trở nên phức tạp đối với nhà phát triển.

3. Cài đặt và ví dụ sử dụng kiểu ENUM

Cài đặt cơ bản và xử lý lỗi

Cài đặt kiểu ENUM chỉ cần chỉ định các chuỗi có thể lưu trong danh sách. Dưới đây là ví dụ định nghĩa cột kiểu ENUM trong 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 5 giá trị “XS”, “S”, “M”, “L”, “XL”. Nếu cố gắng chèn một giá trị không có trong danh sách (ví dụ: ’XXL’), sẽ xảy ra lỗi Data truncated. Điều này ngăn chặn việc lưu các giá trị không có trong danh sách và giúp duy trì tính nhất quán của dữ liệu.

Ví dụ thực tế

Tiếp theo, chúng tôi sẽ đưa ra ví dụ sử dụng kiểu ENUM quản lý vai trò người dùng (“Quản trị viên”, “Người dùng thường”, “Khách”).
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    role ENUM('Quản trị viên', 'Người dùng thường', 'Khách') NOT NULL
);
Nếu muốn cấp quyền thao tác khác nhau dựa trên vai trò, việc sử dụng cột kiểu ENUM giúp dễ dàng duy trì tính nhất quán của dữ liệu.

4. Xử lý chỉ mục và NULL của kiểu ENUM

Sử dụng chỉ mục

Giá trị của kiểu ENUM được gán chỉ mục bắt đầu từ 1 theo thứ tự trong danh sách. Ví dụ, nếu có cột ENUM lưu thông tin kích thước như sau:
CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    size ENUM('S', 'M', 'L', 'XL')
);
‘S’ được gán chỉ mục 1, ‘M’ chỉ mục 2… . Chỉ mục này cũng có thể được chỉ định trong điều kiện của câu lệnh WHERE, cho phép thao tác dữ liệu hiệu quả.
SELECT * FROM products WHERE size = 2;
Truy vấn này sẽ lấy các bản ghi có kích thước là ‘M’.

Xử lý NULL và chuỗi rỗng

Nếu cho phép NULL trong cột kiểu ENUM, bạn có thể lưu giá trị NULL ngay cả khi không có trong danh sách. Ngoài ra, khi chuỗi rỗng được chèn như dữ liệu lỗi, nó sẽ được lưu dưới dạng chỉ mục 0, giúp nhận diện các nhập sai.

5. Bộ ký tự và thứ tự sắp xếp của kiểu ENUM

Cách thiết lập bộ ký tự và thứ tự sắp xếp

Kiểu ENUM, giống như CHAR và VARCHAR, có thể chỉ định bộ ký tự và thứ tự sắp xếp. Đặc biệt quan trọng khi hỗ trợ đa ngôn ngữ hoặc thực hiện tìm kiếm có tính đến thứ tự sắp xếp. Dưới đây là một ví dụ:
CREATE TABLE documents (
    id INT AUTO_INCREMENT PRIMARY KEY,
    language ENUM('Tiếng Nhật', 'Tiếng Anh', 'Tiếng Trung') CHARACTER SET utf8 COLLATE utf8_general_ci
);
Trong ví dụ này, bộ ký tự UTF-8 và thứ tự sắp xếp chung được chỉ định.

6. Tính mở rộng và các giải pháp thay thế của kiểu ENUM

Biện pháp mở rộng

Kiểu ENUM thiếu tính linh hoạt trong việc lưu trữ các giá trị tự do trong cột, vì vậy không phù hợp với dữ liệu thay đổi động. Trong trường hợp này, có thể thêm tùy chọn “Khác” và tạo một cột nhập liệu tự do riêng biệt:
ALTER TABLE products 
MODIFY COLUMN category ENUM('Thực phẩm', 'Quần áo', 'Đồ điện tử', 'Nội thất', 'Khác') NOT NULL,
ADD COLUMN category_other VARCHAR(255) DEFAULT NULL;
Bằng cách này, các mục không có trong kiểu ENUM được lưu trong một cột VARCHAR khác, cho phép đáp ứng linh hoạt.

Các kiểu dữ liệu thay thế như SET và VARCHAR

Là một giải pháp, có thể xem xét sử dụng kiểu SET, cho phép lưu trữ nhiều lựa chọn, hoặc kiểu VARCHAR linh hoạt hơn như là các lựa chọn thay thế cho kiểu ENUM.