MySQL enum กับ set


92

สำหรับ MySQL Data type ของ "enum" และ "set" อะไรคือความแตกต่างและข้อดีและข้อเสียของการใช้แบบใดแบบหนึ่งกับแบบอื่น?

ตัวอย่างประเภทข้อมูล:

  • enum ('A', 'B', 'C')
  • ตั้งค่า ('A', 'B', 'C')

ข้อแตกต่างเพียงอย่างเดียวที่ฉันทราบคือ ENUM อนุญาตให้เลือกได้เพียงค่าเดียวเมื่อเทียบกับ SET ทำให้สามารถเลือกได้หลายค่า


5
ไม่มี adv / disadv คุณควรเลือกหนึ่งในนั้นขึ้นอยู่กับความต้องการของคุณ
ravnur

1
ทั้งสองประเภทไม่เกี่ยวข้องกัน คุณอาจถามว่าอันไหนดีกว่า - int หรือ text?
โบฮีเมียน

คำตอบ:


68

ตามที่เอกสาร MySQLระบุ:

คำจำกัดความของคอลัมน์ ENUM หรือ SET ทำหน้าที่เป็นข้อ จำกัด ของค่าที่ป้อนลงในคอลัมน์ เกิดข้อผิดพลาดสำหรับค่าที่ไม่ตรงตามเงื่อนไขเหล่านี้:

ค่า ENUM ต้องเป็นหนึ่งในค่าที่ระบุไว้ในนิยามคอลัมน์หรือค่าเทียบเท่าตัวเลขภายใน ค่าไม่สามารถเป็นค่าความผิดพลาด (นั่นคือ 0 หรือสตริงว่าง) สำหรับคอลัมน์ที่กำหนดเป็น ENUM ('a', 'b', 'c') ค่าเช่น '', 'd' หรือ 'ax' จะผิดกฎหมายและถูกปฏิเสธ

ค่า SET ต้องเป็นสตริงว่างหรือค่าที่ประกอบด้วยเฉพาะค่าที่ระบุไว้ในนิยามคอลัมน์โดยคั่นด้วยเครื่องหมายจุลภาค สำหรับคอลัมน์ที่กำหนดเป็น SET ('a', 'b', 'c') ค่าเช่น 'd' หรือ 'a, b, c, d' จะผิดกฎหมายและถูกปฏิเสธ


22
บันทึก! ค่าของ(a, b, c, d)จะไม่ถูกปฏิเสธ เพียงแค่จะถูกปฏิเสธจึงทำให้เกิดความคุ้มค่าd (a, b, c)
Itay Grudev

3
นี่อาจเป็นเอกสารอย่างเป็นทางการ แต่ยังคงเป็นวิธีที่สับสนในการอธิบาย จากคำตอบอื่น ๆ ความแตกต่างจะชัดเจน SET คืออาร์เรย์ของ ENUM โดยแต่ละค่าประกอบด้วยค่าลักษณะ enum 0 หรือมากกว่า
Jonathon

10
นี่ไม่ใช่คำตอบที่ดี ขอคำอธิบายที่ชัดเจนเกี่ยวกับความแตกต่างและข้อเสีย / ข้อดี เอกสารอย่างเป็นทางการซึ่งคำตอบนี้เป็นเพียงสำเนาไม่สามารถทำได้
Smuuf

(a, b, c, d) จะถูกปฏิเสธหากเปิดโหมดเข้มงวด
ชินเมย์

2
นี่ไม่ใช่คำตอบ
Amit Shah

205

การเปรียบเทียบ:
ENUM = ช่องวิทยุ (เฉพาะค่าที่ยอมรับคือค่าที่ระบุไว้อาจเลือกได้เพียงช่องเดียว)
ฟิลด์ SET = ช่องทำเครื่องหมาย (เฉพาะค่าที่ยอมรับคือค่าที่ระบุไว้อาจเลือกได้หลายค่า)


5
อ่านเข้าใจง่าย!
Abu

นี่คือความแตกต่างที่ถูกต้องซึ่งอธิบายไว้อย่างชัดเจน ขอบคุณ @Brad Kent
Ravi Teja

44

Enum และ Set ขึ้นอยู่กับข้อกำหนดทั้งหมดเช่นหากคุณมีรายการปุ่มตัวเลือกที่สามารถเลือกได้ครั้งละหนึ่งปุ่มให้ใช้ Enum และหากคุณมีรายการช่องทำเครื่องหมายที่สามารถเลือกได้มากกว่าหนึ่งรายการในแต่ละครั้งให้ใช้ชุด


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');

คุณสามารถคัดลอกโค้ดด้านบนและวางใน mysql และคุณจะพบว่าSETเป็นคอลเล็กชันจริงๆ คุณสามารถจัดเก็บแอตทริบิวต์ที่คุณประกาศไว้รวมกัน

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');

คุณยังสามารถคัดลอกโค้ดด้านบน และคุณจะพบว่าแต่ละENUMสามารถจัดเก็บได้เพียงครั้งเดียวในแต่ละครั้ง และคุณจะพบว่าผลลัพธ์ของ 2 บรรทัดสุดท้ายจะว่างเปล่า


9

จริงๆแล้วมันค่อนข้างง่าย:

เมื่อคุณกำหนดENUM ('ใช่', 'ไม่', 'อาจจะ')คุณต้องใส่ค่าเหล่านี้เพียงค่าเดียว (หรือหมายเลขดัชนีตำแหน่ง)

เมื่อคุณกำหนดSET ('R', 'W', 'X')แล้วคุณสามารถแทรกสตริงว่างหรือค่าเหล่านี้อย่างน้อยหนึ่งค่า หากคุณแทรกสิ่งที่ไม่ได้อยู่ในชุดที่กำหนดไว้ล่วงหน้าสตริงว่างจะถูกแทรกแทน โปรดทราบว่าก่อนที่จะแทรกค่าที่ซ้ำกันทั้งหมดจะถูกละทิ้งดังนั้นจึงมีการแทรกเพียงหนึ่งอินสแตนซ์ของแต่ละค่าที่อนุญาต

หวังว่าสิ่งนี้จะกระจ่างขึ้น

โปรดทราบว่าคำตอบของ Winbobob ไม่ถูกต้องและมีตัวอย่างที่มีข้อบกพร่องเช่นเมื่อแทรกค่าหลายค่าค่าจะต้องเป็นสตริงโดยคั่นด้วยเครื่องหมายจุลภาค ส่วนแทรกทั้งหมดของเขากำลังแทรกเพียงค่าเดียว (และสองค่าสุดท้ายไม่ได้อยู่ในชุดที่กำหนดไว้)


0

ENUM -> เลือกเพียงค่าเดียวที่มีเพื่อแทรก

(no_null, no_any_duplicate)


SET -> เลือกชุดค่าผสมหรือค่าเดียวเช่นชุดและใส่เข้าไป

(null, individual_values, all_the_available_values_together)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.