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

MySQL: แปลง BOOL เป็น TINYINT(1) ภายใน (Internal Conversion)

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