คอลัมน์ชนิด BIT ใน MySQL เมื่อ SELECT โดยตรง จะแสดงเป็น **ค่าว่าง (Blank)** หรืออักขระควบคุม เพราะเป็น Binary Data ต้องแปลงเป็นตัวเลขก่อนจึงจะเห็นค่า 0 หรือ 1
วิธีแก้: บวก 0 (Cast เป็น Integer)
SELECT yourBitColumnName + 0 FROM yourTableName;
ตัวอย่างการใช้งาน
1. สร้างตาราง BIT Column
mysql> CREATE TABLE BitDemo (
-> hasValidId BIT NOT NULL
-> );
Query OK, 0 rows affected (1.21 sec)
2. เพิ่มข้อมูล 0 และ 1
mysql> INSERT INTO BitDemo VALUES (1);
mysql> INSERT INTO BitDemo VALUES (0);
3. SELECT ปกติ (เห็น Blank)
mysql> SELECT * FROM BitDemo;
+------------+
| hasValidId |
+------------+
| |
| |
+------------+
2 rows in set (0.00 sec)
4. SELECT + 0 (เห็นค่าจริง)
mysql> SELECT hasValidId + 0 FROM BitDemo;
+--------------+
| hasValidId+0 |
+--------------+
| 1 |
| 0 |
+--------------+
2 rows in set (0.00 sec)
วิธีอื่นๆ
CAST()
SELECT CAST(hasValidId AS UNSIGNED) FROM BitDemo;
CONV() - แปลงฐาน
SELECT CONV(hasValidId, 2, 10) FROM BitDemo;
BIN() - แสดงเป็น Binary String
SELECT BIN(hasValidId + 0) FROM BitDemo;
BIT vs BOOLEAN vs TINYINT(1)
| ชนิด | Storage | ค่าที่รับได้ | แสดงผล SELECT ตรง |
|---|---|---|---|
BIT(1) | 1 bit | 0, 1 | Blank (Binary) |
BOOLEAN / BOOL | 1 byte (TINYINT) | 0, 1 (TRUE/FALSE alias) | 0 / 1 |
TINYINT(1) | 1 byte | -128 ถึง 127 | 0 / 1 |
แนะนำ: ใช้ BOOLEAN หรือ TINYINT(1) แทน BIT(1) สำหรับ Flag ทั่วไป เพราะอ่านง่าย ไม่ต้อง Cast และ Index ทำงานได้ดีกว่า
BIT(M) สำหรับหลาย Bit
CREATE TABLE flags (
permissions BIT(8) -- 8 bits = 1 byte
);
INSERT INTO flags VALUES (b'10101010'); -- Binary Literal
SELECT permissions + 0, BIN(permissions + 0) FROM flags;
-- 170, '10101010'
ใช้ b'...' Syntax สำหรับ Binary Literal