개발 Q&A

제목 MySQL GROUP_CONCAT() 버전별 차이
카테고리 DB
글쓴이 주말생각 작성시각 2021/07/06 10:29:36
댓글 : 4 추천 : 0 스크랩 : 0 조회수 : 11810   RSS

MySQL에서 GROUP_CONCAT()을 사용하는데, 버전별로 차이가 있는 것을 확인했습니다.

MySQL 5.5버전, 5.1버전 2가지를 사용 중인데, 정수형 필드를 표현할 때, 차이가 있었습니다.

문자열을 제대로 출력됩니다.

 

MySQL 5.5버전은 정수형 필드를

ex) 1, 2, 5 제대로 출력하는데

 

MySQL 5.1버전은 정수형 필드를

ex) 0x333, 0x5689와 같은 16진수로 표현합니다.

 

구글링을 해도 마땅한 결과가 없어서 이렇게 질문을 드립니다.

 

 다음글 javascript api 라고 해야 할까요.. 제작 ... (2)
 이전글 개발환경 설정 질문입니다. (8)

댓글

변종원(웅파) / 2021/07/06 11:54:11 / 추천 0

cast()랑 조합해서 사용해보세요.

https://www.plus2net.com/sql_tutorial/group_concat.php

한대승(불의회상) / 2021/07/06 12:28:21 / 추천 0
php에서 쿼리 결과 값도 이상한가요?
주말생각 / 2021/07/06 13:56:40 / 추천 0

@변종원님

cast를 조합하니 잘 되네요.

@한대승님

php에서는 cast를 조합하지 않아도 16진수로 나오지 않고 10진수로 나오네요.

 

모두 답변 감사합니다.

근데 원인이 MySQL이 정수형 데이터를 16진수로 변환하여 저장해서 그런건가요?

tuyitu719 new / 2026/03/14 10:22:09 / 추천 0

안녕하세요.
이건 단순히 “MySQL 5.1은 정수를 16진수로 바꿔서 보여준다” 라기보다는, GROUP_CONCAT()결과 타입이 binary 계열로 처리되어서 클라이언트에서 hex 형태로 보이는 경우에 더 가깝습니다. MySQL 공식 문서도 GROUP_CONCAT() 의 결과가 binary string 이면 클라이언트에서 16진수 표기로 표시될 수 있다고 설명하고 있습니다.

특히 구버전 MySQL에서는 GROUP_CONCAT() 내부에 ORDER BY 를 넣고, 그 정렬 대상이 문자열이 아닌 숫자 컬럼일 때 결과 문자셋이 binary 로 바뀌는 버그가 있었습니다. MySQL 버그 #18281 에서도 GROUP_CONCAT(c1 ORDER BY c2) 처럼 비문자열 컬럼으로 정렬하면 결과 charset 이 utf8 이 아니라 binary 로 바뀌는 현상이 재현되어 있고, 이 때문에 결과가 hex 처럼 보일 수 있습니다.

그래서 실무에서는 버전 차이를 억지로 맞추기보다, 명시적으로 문자열로 캐스팅해서 처리하는 방법을 가장 많이 씁니다. 예를 들면 아래처럼 바꾸면 됩니다.


 
 
SELECT GROUP_CONCAT(CAST(int_col AS CHAR) SEPARATOR ',')
FROM your_table;
 

혹시 ORDER BY 를 같이 쓰고 있다면 이렇게 하는 편이 더 안전합니다.


 
 
SELECT GROUP_CONCAT(CAST(int_col AS CHAR) ORDER BY int_col SEPARATOR ',')
FROM your_table;
 

또는 간단하게 문자열 컨텍스트로 바꾸기 위해 CONCAT('', int_col) 를 써도 됩니다. 핵심은 숫자값을 먼저 CHAR 로 바꾼 뒤 GROUP_CONCAT() 에 넣는 것입니다. MySQL 쪽에서도 비문자열이 섞인 경우 문자열로 명시적 변환을 해두는 것이 가장 확실한 우회 방법이고, 비슷한 관련 버그에서도 CAST(... AS CHAR) 가 해결책으로 확인됩니다.

정리하면:

  • GROUP_CONCAT() 자체가 정수를 무조건 hex 로 바꾸는 것은 아닙니다.

  • 구버전(특히 5.1 계열)에서 결과가 binary 로 잡히는 상황이 있으면 hex 처럼 보일 수 있습니다.

  • 가장 안전한 해결 방법은 CAST(정수필드 AS CHAR)GROUP_CONCAT() 하는 것입니다.

추가로, MySQL 5.1과 5.5는 이미 지원 종료(EOL)된 매우 오래된 버전이라 이런 차이를 버전별로 완전히 일관되게 맞추기보다는, 쿼리에서 타입을 명시적으로 맞추는 방향이 좋습니다.

참고 사이트: www.cbalist.com