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

แก้ไข GROUP_CONCAT คืนค่าแปลกๆ กับ BIT Field ใน MySQL

ปัญหา: 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) แต่ง่ายต่อการใช้งานกว่า