CONCAT 함수가 문자열이나 표현식 인자값을 결합하여 하나의 문자열로 반환하는 함수라면,
GROUP_CONCAT 함수는 그룹 내에 NULL 이 아닌 값을 결합하여 하나의 문자열로 반환하는 집계 함수이다.
그런데 CONCAT 함수와 달리 GROUP_CONCAT 함수는 반환 가능한 최대 문자열 길이 제한이 있다.
employees 테이블의 행 개수가 30만이 넘어가지만
GROUP_CONCAT 함수를 사용해서 콤마(,
)로 결합된 전체 직원들의 first name 목록 문자열을 조회해보면, 결과 문자열 길이가 1024 자 밖에 안되는 걸 알 수 있다.
왜냐하면 반환 가능한 최대 문자열 길이가 1024 자로 제한되어 있기 때문이다.
GROUP_CONCAT 함수로 결합된 문자열 길이가 해당 길이 제한을 초과할 경우 뒷부분은 잘린 채 반환된다.
현재 시스템에 설정된 반환 가능한 최대 문자열 길이는 아래 쿼리를 실행해보면 알 수 있다.
(디폴트는 1024 바이트이다)
SHOW VARIABLES LIKE '%GROUP_CONCAT%';
만약에 그 이상의 길이의 문자열 값을 조회해야 한다면, group_concat_max_len
라는 시스템 변수 값을 바꿔서 길이 제한을 늘릴 수 있다.
아래는 반환 가능한 최대 문자열 길이를 10만 바이트로 늘리는 쿼리 예시이다.
SET GLOBAL group_concat_max_len = 100000;
그룹 별로 어떤 값 목록을 조회하는게 목적이라면, GROUP_CONCAT 함수 대신에 JSON_ARRAYAGG 함수를 사용하는 것도 또 한가지 방법이다.
JSON_ARRAYAGG 함수는 반환 가능한 최대 문자열 길이 제한이 없기 때문이다.
GROUP_CONCAT 함수 대신에 JSON_ARRAYAGG 함수를 사용해서 전체 직원의 first name 목록을 조회해보면, 결과 문자열 길이가 1024 자 보다 훨씬 큰 것을 확인할 수 있다.