Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL ควรใช้ ENUM หรือ TINYINT สำหรับค่าที่เป็นแค่ 0 และ 1?

แนะนำให้ใช้ TINYINT สำหรับค่าที่มีเพียง 0 และ 1 (Boolean/Flag) เพราะมีข้อดีมากกว่า ENUM ในหลายด้าน

ตัวอย่างการใช้ TINYINT

1. สร้างตาราง

mysql> CREATE TABLE DemoTable (
    IsMarried TINYINT
);
Query OK, 0 rows affected (0.94 sec)

2. เพิ่มข้อมูล (0 = ไม่สมรส, 1 = สมรส)

mysql> INSERT INTO DemoTable VALUES(1);
Query OK, 1 row affected (0.21 sec)
mysql> INSERT INTO DemoTable VALUES(0);
Query OK, 1 row affected (0.13 sec)

3. แสดงข้อมูล

mysql> SELECT * FROM DemoTable;
+-----------+
| IsMarried |
+-----------+
|         1 |
|         0 |
+-----------+

เปรียบเทียบ TINYINT vs ENUM สำหรับค่า 0/1

ด้านเปรียบเทียบTINYINTENUM('0','1')
พื้นที่จัดเก็บ1 ไบต์1-2 ไบต์ (ขึ้นอยู่กับจำนวนค่าใน ENUM)
การคำนวณ/เปรียบเทียบรวดเร็วที่สุด (เป็นตัวเลขจริง)ช้ากว่า (เปรียบเทียบสตริง/ดัชนี)
การใช้ในเงื่อนไขWHERE flag = 1, WHERE flagWHERE flag = '1' ต้องใช้คำพูด
ฟังก์ชันรวม (SUM, AVG)ใช้ได้โดยตรง (SUM(flag) = นับจำนวน 1)ต้อง CAST ก่อน
Indexมีประสิทธิภาพสูงมีประสิทธิภาพต่ำกว่า
ความยืดหยุ่นเปลี่ยนเป็น Boolean, เพิ่มค่าได้ง่ายต้อง ALTER TABLE เพื่อเพิ่มค่าใน ENUM
Portabilityรองรับทุก DatabaseMySQL Specific

Best Practice: ใช้ TINYINT(1) พร้อม Comment

CREATE TABLE users (
    is_active TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1=Active, 0=Inactive',
    is_deleted TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1=Deleted, 0=Normal'
);

เมื่อไหร่ควรใช้ ENUM?

  • ค่าที่มีจำนวนจำกัดและคงที่ (Fixed set) เช่น status ENUM('pending','approved','rejected')
  • ต้องการ Enforce ค่าที่อนุญาตได้ที่ระดับ Database (Data Integrity)
  • ค่าที่ไม่ใช่ Boolean/Flag แบบง่ายๆ

สรุป

สำหรับ Flag/Boolean (0, 1) ให้ใช้ TINYINT(1) จะได้ประสิทธิภาพ ความยืดหยุ่น และความเข้ากันได้ข้าม Database ดีกว่า ENUM โดยมาก