TINYINT(1) และ BOOLEAN ใน MySQL: จริงๆ แล้วเหมือนกัน
สรุปสั้นๆ: ใน MySQL ไม่มีความแตกต่างกัน ระหว่าง TINYINT(1) และ BOOLEAN (หรือ BOOL) เพราะ MySQL แปลง BOOLEAN เป็น TINYINT(1) ภายในโดยอัตโนมัติ
การทดสอบยืนยัน
1. สร้างตารางด้วย BOOLEAN
CREATE TABLE DemoTable (
isMarried BOOLEAN
);
2. ตรวจสอบโครงสร้างตาราง
DESC DemoTable;
ผลลัพธ์:
+-----------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------+------+-----+---------+-------+
| isMarried | tinyint(1) | YES | | NULL | |
+-----------+------------+------+-----+---------+-------+
เห็นชัดว่า MySQL แปลง BOOLEAN ให้เป็น tinyint(1) แล้ว
3. เพิ่มข้อมูลด้วย TRUE/FALSE
INSERT INTO DemoTable VALUES (TRUE);
INSERT INTO DemoTable VALUES (FALSE);
4. ดูข้อมูลที่จัดเก็บ
SELECT * FROM DemoTable;
ผลลัพธ์:
+-----------+
| isMarried |
+-----------+
| 1 |
| 0 |
+-----------+
ค่า TRUE ถูกเก็บเป็น 1 และ FALSE เป็น 0
รายละเอียดทางเทคนิค
| ลักษณะ | TINYINT(1) | BOOLEAN/BOOL |
|---|---|---|
| พื้นที่จัดเก็บ | 1 ไบต์ | 1 ไบต์ (แปลงเป็น TINYINT(1)) |
| ช่วงค่า | -128 ถึง 127 (SIGNED) 0 ถึง 255 (UNSIGNED) | 0 (FALSE) และ 1 (TRUE) |
| ค่าคงที่ | ใช้ตัวเลข | ใช้ TRUE/FALSE (แปลงเป็น 1/0) |
| การใช้ดัชนี (Index) | ได้ | ได้ (เหมือนกัน) |
ข้อแนะนำในการใช้งาน
- ใช้ BOOLEAN/BOOL เมื่อต้องการความชัดเจนทางความหมาย (Semantic clarity) - บอกได้เลยว่าคอลัมน์นี้เป็นจริง/เท็จ
- ใช้ TINYINT(1) เมื่อต้องการควบคุมรายละเอียดมากขึ้น เช่น ต้องการ UNSIGNED หรือเก็บค่าอื่นนอกจาก 0/1
- ทั้งสองตัวเลือกใช้
INDEXได้เหมือนกัน - ใน Application Layer ควรแปลง 0/1 ให้เป็น boolean จริงของภาษาโปรแกรม (true/false)
ข้อผิดพลาดที่พบบ่อย
คิดว่า BOOLEAN จะเก็บได้แค่ TRUE/FALSE เท่านั้น → ผิด MySQL อนุญาตให้ INSERT ค่าตัวเลขอื่นได้ (เช่น 2, 5, -1) แต่จะแปลงเป็น 1 (TRUE) ทั้งหมด ยกเว้น 0