문제 상황
MySQL에서 BIT 타입의 열에 GROUP_CONCAT() 함수를 그대로 적용하면 의미를 알 수 없는 깨진 값(쓰레기 값)이 반환되는 경우가 있습니다. 이는 BIT 값이 문자열로 변환되는 과정에서 발생하는 현상입니다.
해결 방법
해결 방법은 아주 간단합니다. GROUP_CONCAT() 내부에서 해당 열에 +0을 더해주면 됩니다. 이렇게 하면 BIT 값이 숫자로 변환되어 정상적인 결과를 얻을 수 있습니다.
1. 테이블 생성
먼저 테스트용 테이블을 생성해 보겠습니다.
mysql> create table DemoTable1856
(
Id int,
Value bit(1)
);
Query OK, 0 rows affected (0.00 sec)2. 데이터 삽입
INSERT 명령을 사용하여 테이블에 레코드를 추가합니다.
mysql> insert into DemoTable1856 values(101,1); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1856 values(102,0); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1856 values(101,0); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1856 values(102,1); Query OK, 1 row affected (0.00 sec) mysql> insert into DemoTable1856 values(101,0); Query OK, 1 row affected (0.00 sec)
3. 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1856;
실행 결과는 다음과 같습니다. BIT 타입 특성상 Value 열의 값이 화면에 제대로 표시되지 않는 것을 확인할 수 있습니다.
+------+-------+ | Id | Value | +------+-------+ | 101 | | | 102 | | | 101 | | | 102 | | | 101 | | +------+-------+ 5 rows in set (0.00 sec)
4. 해결 쿼리 실행
이제 BIT 필드에 GROUP_CONCAT()을 적용하면서 +0을 더해 깨진 값 없이 정상적인 결과를 얻는 쿼리를 살펴보겠습니다.
mysql> select group_concat(Value+0) from DemoTable1856
group by Id;실행 결과는 다음과 같습니다. Id별로 BIT 값이 숫자 형태로 정확하게 집계된 것을 확인할 수 있습니다.
+-----------------------+ | group_concat(Value+0) | +-----------------------+ | 1,0,0 | | 0,1 | +-----------------------+ 2 rows in set (0.00 sec)
정리
BIT 타입 열에 GROUP_CONCAT()을 사용할 때는 반드시 +0 연산을 추가하여 값을 숫자로 변환해 주세요. 이 한 줄의 처리만으로 깨진 값 없이 원하는 결과를 얻을 수 있습니다.