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