PAD · TRIM — 패딩과 공백 제거 완전 정리
문자열의 "길이"와 "군더더기"를 다루는 두 부류의 함수를 함께 본다. 하나는 LPAD/RPAD처럼 문자열이 짧을 때 특정 문자로 채워서 자릿수를 맞추는 함수이고, 다른 하나는 TRIM/LTRIM/RTRIM처럼 문자열 양 끝의 불필요한 공백이나 특정 문자를 걷어내는 함수다. 방향은 반대지만 둘 다 "문자열의 양 끝을 어떻게 다룰 것인가"라는 같은 질문에서 나온 함수들이다.
| 함수 호출 | 결과 | 비고 |
|---|---|---|
LPAD('이것이', 5, '##') |
「##이것이」 | 원본 3자 + 왼쪽에 2자 채움 = 총 5자 |
RPAD('이것이', 5, '##') |
「이것이##」 | 원본 3자 + 오른쪽에 2자 채움 = 총 5자 |
LTRIM(' 이것이') |
「이것이」 | 왼쪽 공백 3칸만 제거, 오른쪽엔 원래 없었음 |
RTRIM('이것이 ') |
「이것이」 | 오른쪽 공백 3칸만 제거 |
TRIM(' 이것이 ') |
「이것이」 | 양쪽 공백 모두 제거 |
TRIM(BOTH 'ㅋ' FROM 'ㅋㅋㅋ재밌어요.ㅋㅋㅋ') |
「재밌어요.」 | 공백이 아닌 지정 문자 'ㅋ'를 양쪽에서 제거 |
회원번호, 상품코드, 시리얼번호처럼 "고정된 자릿수"가 필요한 데이터는 실무에서 아주 흔하다. 예를 들어 회원번호를 항상 5자리로 통일해서 00007, 00042처럼 보여주고 싶을 때, 원본 데이터는 7, 42처럼 자릿수가 제각각이다. 이때 LPAD(값, 목표길이, 채울문자)를 쓰면 왼쪽에 부족한 자릿수만큼 지정 문자를 채워 넣어 시각적으로 자릿수를 통일할 수 있다. 사람이 숫자를 읽을 때 "앞자리가 비어 있으면 0으로 채운다"는 관습을 그대로 SQL 함수로 옮긴 것이라고 생각하면 이해가 쉽다.
RPAD는 LPAD와 정반대로 문자열 오른쪽에 지정 문자를 채운다. 숫자를 정렬할 때는 보통 왼쪽 채움(LPAD)을 쓰지만, 이름·상품명처럼 왼쪽 정렬로 표를 맞추고 싶을 때는 오른쪽 채움(RPAD)이 더 자연스럽다. 예를 들어 모니터링 콘솔이나 로그 출력에서 컬럼 폭을 고정 너비로 맞추고 싶을 때, 짧은 문자열 뒤에 공백이나 점(.)을 채워 넣으면 세로로 줄이 딱 맞아 떨어지는 표 형태를 만들 수 있다.
LPAD·RPAD의 두 번째 인자(목표 길이)는 "최소 길이"가 아니라 "정확히 이 길이로 맞춘다"는 뜻이다. 그래서 원본 문자열이 목표 길이보다 이미 길면, 채우기는 일어나지 않고 오히려 원본이 목표 길이만큼 잘려서 반환된다. 이 동작을 모르고 사용하면 "분명 패딩만 추가했는데 데이터 뒷부분이 사라졌다"는 문제를 겪게 된다.
사용자가 폼에 값을 입력할 때 실수로 앞뒤에 공백을 붙여 넣는 일은 매우 흔하다. ' 홍길동'과 '홍길동'은 사람 눈에는 같아 보여도 데이터베이스 입장에서는 완전히 다른 문자열이라 WHERE name = '홍길동' 조건에 걸리지 않는다. TRIM(문자열)은 이런 "보이지 않는 오차"를 없애서 검색·비교·중복 체크를 정확하게 만들어주는 가장 기본적인 데이터 정제 함수다.
TRIM이 항상 정답은 아니다. 어떤 경우엔 "왼쪽 공백만" 혹은 "오른쪽 공백만" 제거해야 하는 상황이 있다. 예를 들어 오른쪽 공백은 표 정렬을 위해 일부러 넣어둔 것이라 유지하고, 왼쪽 앞부분에 실수로 들어간 공백만 지우고 싶을 때는 LTRIM을, 반대로 뒤쪽 트레일링 스페이스만 지우고 싶을 때는 RTRIM을 쓴다. 즉 TRIM이 "양쪽 다 밀어버리는 큰 빗자루"라면, LTRIM·RTRIM은 "한쪽 방향만 청소하는 정밀한 빗자루"다.
TRIM의 진짜 힘은 "공백"이 아니라 "임의의 문자"를 지울 수 있다는 데 있다. TRIM(BOTH 'ㅋ' FROM 'ㅋㅋㅋ재밌어요.ㅋㅋㅋ')처럼 옵션 키워드(BOTH/LEADING/TRAILING)와 제거할 문자, 그리고 FROM 뒤에 대상 문자열을 지정하면 공백이 아닌 특정 문자도 양쪽·왼쪽·오른쪽에서 걷어낼 수 있다. 이 문법은 "장식성 반복 문자(ㅋㅋㅋ, ***, ---)"나 "구분자로 쓰인 문자"를 데이터 정제 단계에서 제거할 때 유용하다.
TRIM(문자열)) MySQL은 기본값으로 BOTH + 공백을 적용한다. 즉 4번 섹션의 TRIM은 이 문법의 축약형이다.| 실수 | 증상 | 해결 |
|---|---|---|
| LPAD/RPAD의 목표 길이를 원본보다 짧게 지정 | 패딩이 아니라 데이터 뒷부분이 잘려서 저장됨 | 목표 길이를 "들어올 수 있는 가장 긴 값" 기준으로 넉넉히 잡는다 |
| TRIM이 공백만 지운다고 착각 | BOTH/문자 지정 문법을 몰라 특수문자 제거를 별도 REPLACE로 처리 | TRIM(BOTH '문자' FROM 문자열) 문법으로 한 번에 처리 |
| LTRIM/RTRIM을 반대로 사용 | 지우려던 공백이 그대로 남아있음 | L은 왼쪽(Left), R은 오른쪽(Right) — 이니셜 기준으로 방향 재확인 |
| WHERE절 비교 전에 TRIM을 안 걸어줌 | 공백 포함 데이터가 검색·중복체크에서 누락됨 | 사용자 입력값 저장·비교 전 TRIM(컬럼) 습관화 |
| LPAD 채움 문자가 여러 글자일 때 길이 계산 실수 | 예상보다 결과 길이가 짧거나 문자가 중간에 잘려 보임 | 목표 길이는 "글자 수" 기준이며 채움 문자는 필요한 만큼만 반복·절단됨을 이해 |
핵심 한 줄 요약
Tags
'php' 카테고리의 다른 글
| MySQL ELT · LOCATE · INSTR — 위치·값 찾기 완전 정리 (0) | 2026.06.27 |
|---|---|
| MySQL SUBSTRING · SPACE · SUBSTRING_INDEX — 문자열 추출 완전 정리 (0) | 2026.06.27 |
| MySQL CASE WHEN — 다중 조건 분기 완전 정리 (0) | 2026.06.27 |
| MySQL IF · IFNULL · NULLIF — 조건·NULL 처리 완전 정리 (0) | 2026.06.27 |
| MySQL CONCAT — 문자열 연결 완전 정리 (0) | 2026.06.27 |
왕진 블로그

댓글