Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

So sánh kiểu dữ liệu INT và ENUM trong MySQL: Khi nào nên dùng loại nào?

Việc lựa chọn giữa INT (hoặc TINYINT UNSIGNED) và ENUM phụ thuộc vào đặc điểm dữ liệu và yêu cầu nghiệp vụ.

Khi nào nên dùng ENUM?

  • Danh sách giá trị cố định, biết trước, ít thay đổi (ví dụ: trạng thái: 'active', 'inactive', 'pending'; size: 'S', 'M', 'L').
  • Muốn ràng buộc dữ liệu ở cấp database: chỉ cho phép các giá trị trong danh sách, chèn giá trị khác sẽ báo lỗi (Data truncated).
  • Cần tính dễ đọc: giá trị lưu trữ là chuỗi có ý nghĩa, không phải số mã hóa.
  • Số lượng giá trị nhỏ (tối đa 65.535 giá trị khác nhau).

Ví dụ ENUM

mysql> CREATE TABLE DemoTable (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    Number ENUM('10', '20', '30')
);

mysql> INSERT INTO DemoTable (Number) VALUES ('10'), ('20'), ('30');
-- Chèn giá trị không trong danh sách:
mysql> INSERT INTO DemoTable (Number) VALUES ('50');
ERROR 1265 (01000): Data truncated for column 'Number' at row 1

Khi nào nên dùng TINYINT UNSIGNED (hoặc INT)?

  • Danh sách giá trị không cố định, có thể mở rộng, thêm mới thường xuyên.
  • Cần thực hiện phép toán số học, sắp xếp theo giá trị số tự nhiên.
  • Muốn tham chiếu khóa ngoại (Foreign Key) đến bảng lookup (bảng tra cứu) riêng để quản trị danh sách giá trị linh hoạt.
  • Cần lưu trữ phạm vi số lớn hơn (TINYINT UNSIGNED: 0-255, SMALLINT UNSIGNED: 0-65535).

Ví dụ TINYINT UNSIGNED

mysql> CREATE TABLE DemoTable2 (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    Number TINYINT UNSIGNED
);

mysql> INSERT INTO DemoTable2 (Number) VALUES (100), (50), (60), (70);

Không bị giới hạn bởi danh sách giá trị định nghĩa trước.

Bảng so sánh tóm tắt

Tiêu chíENUMTINYINT UNSIGNED
Ràng buộc giá trịChặt chẽ (chỉ giá trị trong danh sách)Lỏng lẻo (bất kỳ số nào trong phạm vi)
Dễ đọcCao (chuỗi có nghĩa)Thấp (số mã hóa)
Thay đổi danh sáchKhó (cần ALTER TABLE)Dễ (chỉ thêm dữ liệu vào bảng lookup)
Hiệu năngTốt (lưu trữ 1-2 byte)Tốt (1 byte)
Phép toán/sắp xếpTheo thứ tự định nghĩa trong ENUMTheo giá trị số tự nhiên

Khuyến nghị: Dùng ENUM cho các thuộc tính phân loại ổn định (trạng thái, loại, phân loại). Dùng TINYINT/SMALLINT + bảng lookup cho các danh sách thay đổi thường xuyên hoặc cần quan hệ khóa ngoại.