ปัญหา: BIT Field กับ GROUP_CONCAT
ชนิดข้อมูล BIT(1) เก็บเป็น Binary ทำให้ GROUP_CONCAT แสดงผลเป็นอักขระควบคุม (Garbage):
mysql> CREATE TABLE DemoTable1856 (
Id INT,
Value BIT(1)
);
mysql> INSERT INTO DemoTable1856 VALUES(101,1), (102,0), (101,0), (102,1), (101,0);
mysql> SELECT * FROM DemoTable1856;
+------+-------+
| Id | Value |
+------+-------+
| 101 | | -- แสดงว่าง (Non-printable)
| 102 | |
| 101 | |
| 102 | |
| 101 | |
+------+-------+
วิธีแก้: บวก 0 เพื่อแปลงเป็นตัวเลข
mysql> SELECT GROUP_CONCAT(Value + 0) FROM DemoTable1856 GROUP BY Id;
ผลลัพธ์:
+-----------------------+
| group_concat(Value+0) |
+-----------------------+
| 1,0,0 |
| 0,1 |
+-----------------------+
เหตุผลที่ทำงาน
BIT(1)จัดเก็บเป็น Binary String (1 ไบต์)- การบวก
+ 0บังคับ Type Casting เป็น Integer - Integer แสดงผลเป็นตัวเลขปกติได้
วิธีอื่นๆ
-- ใช้ CAST
SELECT GROUP_CONCAT(CAST(Value AS UNSIGNED)) FROM DemoTable1856 GROUP BY Id;
-- ใช้ CONVERT
SELECT GROUP_CONCAT(CONVERT(Value, UNSIGNED)) FROM DemoTable1856 GROUP BY Id;
-- ใช้ IF สำหรับแสดงข้อความ
SELECT GROUP_CONCAT(IF(Value = 1, 'true', 'false')) FROM DemoTable1856 GROUP BY Id;
ข้อแนะนำ
- หลีกเลี่ยง BIT สำหรับ Boolean ใช้
TINYINT(1)หรือBOOLEANแทน BOOLEANใน MySQL เป็น Alias ของTINYINT(1)- TINYINT ใช้พื้นที่ 1 ไบต์ เท่ากับ BIT(1) แต่ง่ายต่อการใช้งานกว่า