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

MySQL: แปลง BOOLEAN เป็น INTEGER ด้วย CAST()

การแปลงค่า BOOL/BOOLEAN ให้เป็น INTEGER (0/1) ด้วย CAST

ใน MySQL BOOL และ BOOLEAN เป็น Alias ของ TINYINT(1) ค่า TRUE = 1, FALSE = 0 การใช้ CAST() ช่วยให้ชัดเจนและควบคุมชนิดข้อมูลผลลัพธ์

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

สร้างตารางชนิด BOOL:

mysql> CREATE TABLE convertBoolToIntDemo (
    -> isYoung BOOL
    -> );
Query OK, 0 rows affected (0.69 sec)

mysql> INSERT INTO convertBoolToIntDemo VALUES(TRUE), (FALSE), (TRUE), (FALSE);
Query OK, 4 rows affected (0.12 sec)

ข้อมูลดิบ (แสดงเป็น 1/0 แล้วเพราะเป็น TINYINT):

mysql> SELECT * FROM convertBoolToIntDemo;
+---------+
| isYoung |
+---------+
| 1       |
| 0       |
| 1       |
| 0       |
+---------+
4 rows in set (0.00 sec)

แปลงเป็น SIGNED INTEGER อย่างชัดเจน:

mysql> SELECT CAST(isYoung = 1 AS SIGNED INTEGER) FROM convertBoolToIntDemo;
+-----------------------------------+
| CAST(isYoung=1 AS SIGNED INTEGER) |
+-----------------------------------+
| 1                                 |
| 0                                 |
| 1                                 |
| 0                                 |
+-----------------------------------+
4 rows in set (0.00 sec)

คำอธิบาย

  • isYoung = 1 เป็น Boolean Expression คืนค่า 1 (TRUE) หรือ 0 (FALSE)
  • CAST(... AS SIGNED INTEGER) แปลงผล Boolean ให้เป็น INTEGER อย่างชัดเจน
  • MySQL แปลง BOOL → TINYINT(1) อัตโนมัติตอนสร้างตาราง (ดูได้จาก DESC)

วิธีง่ายกว่า (Implicit Cast)

SELECT isYoung + 0 FROM convertBoolToIntDemo;  -- 1,0,1,0
SELECT isYoung * 1 FROM convertBoolToIntDemo;  -- 1,0,1,0
SELECT CAST(isYoung AS UNSIGNED) FROM convertBoolToIntDemo; -- 1,0,1,0

การบวก 0 หรือคูณ 1 บังคับ Type Conversion ให้เป็น Number ทันที สั้นกว่า CAST

ตรวจสอบชนิดข้อมูลจริงในตาราง

mysql> DESC convertBoolToIntDemo;
+--------------------+-------------+------+-----+---------+----------------+
| 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)

เห็นว่า BOOL กลายเป็น TINYINT(1) จริงๆ แล้ว