[MySQL] GROUP_CONCAT 함수와 문자열 길이 제한 📏

뉴우비(newwwbi)·2023년 10월 3일
0

TIL

목록 보기
4/5
post-thumbnail

GROUP_CONCAT 함수란

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 자 보다 훨씬 큰 것을 확인할 수 있다.

profile
배운 지식을 다른 사람과 공유하고 싶습니다

0개의 댓글