MySQL แปลง BOOL/BOOLEAN เป็น TINYINT(1) ภายในอัตโนมัติ
ใน MySQL BOOL และ BOOLEAN เป็น Synonym (Alias) ของ TINYINT(1) ระบบจะแปลงชนิดข้อมูลนี้เป็น TINYINT(1) ตอนสร้างตารางจริง
ตัวอย่างการใช้งาน
สร้างตารางมีคอลัมน์ BOOL:
mysql> CREATE TABLE boolToTinyIntDemo (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name VARCHAR(20),
-> isAgeGreaterThan18 BOOL
-> );
Query OK, 0 rows affected (1.02 sec)
ตรวจสอบโครงสร้างจริง (DESC):
mysql> DESC boolToTinyIntDemo;
+--------------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+-------------+------+-----+---------+----------------+
| Id | int(11) | NO | PRI | NULL | auto_increment |
| Name | varchar(20) | YES | | NULL | |
| isAgeGreaterThan18 | tinyint(1) | YES | | NULL | |
+--------------------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
เห็นชัดเจน: isAgeGreaterThan18 กลายเป็น tinyint(1)
เพิ่มข้อมูล TRUE/FALSE:
mysql> INSERT INTO boolToTinyIntDemo(Name, isAgeGreaterThan18) VALUES('Larry', TRUE),('Sam', FALSE);
Query OK, 2 rows affected (0.15 sec)
ดูข้อมูล (เก็บเป็น 1/0):
mysql> SELECT * FROM boolToTinyIntDemo;
+----+-------+--------------------+
| Id | Name | isAgeGreaterThan18 |
+----+-------+--------------------+
| 1 | Larry | 1 |
| 2 | Sam | 0 |
+----+-------+--------------------+
2 rows in set (0.00 sec)
คำอธิบาย
TRUE= 1,FALSE= 0 (Case-insensitive)- เก็บจริงเป็น TINYINT(1) ใช้พื้นที่ 1 Byte
IS TRUE,IS FALSE,IS NOT TRUE,IS NOT FALSEใช้ตรวจสอบได้
ข้อได้เปรียบของ TINYINT(1)
- ขนาดเล็กที่สุดสำหรับ Integer (1 Byte)
- Index เร็ว, พื้นที่น้อย
- รองรับค่า -128 ถึง 127 (SIGNED) หรือ 0-255 (UNSIGNED) แต่ BOOL ใช้แค่ 0/1
ข้อควรระวัง
-- ค่าอื่นนอก 0/1 ก็ใส่ได้ (แค่ Warning)
INSERT INTO boolToTinyIntDemo(Name, isAgeGreaterThan18) VALUES('Test', 5);
-- Warning: Truncated incorrect value
-- จะเก็บเป็น 5 (TINYINT Range)
-- แนะนำ: ใช้ CHECK Constraint (MySQL 8.0.16+)
CREATE TABLE t (flag BOOL CHECK (flag IN (0,1)));