MySQL enum so với set


88

Đối với MySQL Kiểu dữ liệu "enum" và "set" sự khác biệt và ưu nhược điểm của việc sử dụng cái này so với cái kia là gì?

Kiểu dữ liệu mẫu:

  • enum ('A', 'B', 'C')
  • set ('A', 'B', 'C')

Sự khác biệt duy nhất mà tôi biết là ENUM chỉ cho phép một giá trị được chọn trong khi SET cho phép nhiều giá trị được chọn.


5
Không có adv / disadv. Bạn nên chọn một trong số họ tùy thuộc vào yêu cầu của bạn.
ravnur

1
Hai loại không liên quan với nhau. Bạn cũng có thể hỏi cái nào tốt hơn - int hay text?
Bohemian

Câu trả lời:


66

Như tài liệu MySQL nêu rõ:

Định nghĩa cột ENUM hoặc SET hoạt động như một ràng buộc đối với các giá trị được nhập vào cột. Xảy ra lỗi cho các giá trị không đáp ứng các điều kiện sau:

Giá trị ENUM phải là một trong những giá trị được liệt kê trong định nghĩa cột hoặc giá trị số bên trong tương đương của nó. Giá trị không được là giá trị lỗi (nghĩa là 0 hoặc chuỗi trống). Đối với cột được định nghĩa là ENUM ('a', 'b', 'c'), các giá trị như '', 'd' hoặc 'ax' là không hợp lệ và bị từ chối.

Giá trị SET phải là chuỗi trống hoặc giá trị chỉ bao gồm các giá trị được liệt kê trong định nghĩa cột được phân tách bằng dấu phẩy. Đối với cột được xác định là SET ('a', 'b', 'c'), các giá trị như 'd' hoặc 'a, b, c, d' là không hợp lệ và bị từ chối.


22
GHI CHÚ! Giá trị của (a, b, c, d)sẽ không bị từ chối. Chỉ cần ý dchí bị từ chối do đó dẫn đến giá trị (a, b, c).
Itay Grudev

3
Đây có thể là tài liệu chính thức, nhưng nó vẫn là một cách mô tả chúng rất khó hiểu. Dựa trên các câu trả lời khác, sự khác biệt trở nên rõ ràng. SET là một mảng ENUM, trong đó mỗi giá trị bao gồm 0 hoặc nhiều giá trị kiểu enum.
Jonathon

9
Đây không phải là một câu trả lời hay. Yêu cầu giải thích rõ ràng về sự khác biệt và nhược điểm / lợi thế; tài liệu chính thức, trong đó câu trả lời này chỉ là một bản sao, không làm được như vậy.
Smuuf

(a, b, c, d) sẽ bị từ chối nếu chế độ Nghiêm ngặt được bật
Chinmay

2
Đây không phải là câu trả lời.
Amit Shah

197

tương tự:
ENUM = trường radio (chỉ những giá trị được chấp nhận mới được liệt kê, chỉ có thể chọn một)
SET = trường hộp kiểm (chỉ những giá trị được chấp nhận mới được liệt kê, có thể chọn nhiều)


5
Sạch sẽ và dễ hiểu!
Abu Shoeb 10/02/19

Đây là sự khác biệt chính xác được mô tả rõ ràng. Cảm ơn bạn @Brad Kent
Ravi Teja

44

Enum và Set hoàn toàn phụ thuộc vào các yêu cầu, chẳng hạn như nếu bạn có một danh sách các nút radio trong đó chỉ có thể chọn một nút tại một thời điểm, hãy sử dụng Enum. Và nếu bạn có một danh sách hộp kiểm trong đó tại một thời điểm nhiều hơn một mục có thể được chọn, hãy sử dụng set.


22
CREATE TABLE setTest(
  attrib SET('bold','italic','underline')
);

INSERT INTO setTest (attrib) VALUES ('bold');
INSERT INTO setTest (attrib) VALUES ('bold,italic');
INSERT INTO setTest (attrib) VALUES ('bold,italic,underline');

Bạn có thể sao chép đoạn mã trên và dán vào mysql, và bạn sẽ thấy rằng SET thực sự là một bộ sưu tập. Bạn có thể lưu trữ từng tổ hợp thuộc tính mà bạn khai báo.

CREATE TABLE enumTest(
 color ENUM('red','green','blue')
);

INSERT INTO enumTest (color) VALUES ('red');
INSERT INTO enumTest (color) VALUES ('gray');
INSERT INTO enumTest (color) VALUES ('red,green');

Bạn cũng có thể sao chép đoạn mã trên. Và bạn sẽ thấy rằng mỗi ENUM chỉ có thể được lưu trữ một lần mỗi lần. Và bạn sẽ thấy rằng kết quả của 2 dòng cuối cùng sẽ trống.


9

Thực ra nó khá đơn giản:

Khi bạn xác định một ENUM ('Có', 'Không', 'Có thể') thì bạn chỉ phải CHÈN một trong các giá trị này (hoặc số chỉ mục vị trí của chúng)

Khi bạn xác định một SET ('R', 'W', 'X') thì bạn có thể CHÈN một chuỗi trống hoặc một hoặc nhiều giá trị này. Nếu bạn chèn thứ gì đó không có trong tập hợp được xác định trước, thì một chuỗi trống sẽ được chèn vào. Lưu ý rằng trước khi chèn, tất cả các giá trị trùng lặp đều bị loại bỏ, vì vậy chỉ một phiên bản của mỗi giá trị được phép đang được chèn.

Hi vọng điều này sẽ làm sáng tỏ nó.

Xin lưu ý rằng câu trả lời của Winbobob không chính xác và chứa các ví dụ sai sót, như khi chèn nhiều giá trị, các giá trị phải là chuỗi, được phân tách bằng dấu phẩy. Tất cả các lần chèn của anh ấy thực sự chỉ đang chèn một giá trị duy nhất (và hai giá trị cuối cùng không nằm trong tập hợp đã xác định)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.