MySQL에서 열 이름 길이가 5자보다 긴 열 찾기
데이터베이스의 네이밍 규칙을 점검하거나 스키마를 정리할 때, "열(컬럼) 이름이 일정 길이 이상인 것만 골라내야 하는" 경우가 종종 있습니다. MySQL에서는 INFORMATION_SCHEMA.COLUMNS 테이블과 HAVING 절을 조합하면 이런 작업을 SQL 한 문장으로 간단히 처리할 수 있습니다.
1. 기본 원리: INFORMATION_SCHEMA.COLUMNS
MySQL은 테이블 구조와 같은 메타데이터를 INFORMATION_SCHEMA라는 가상 데이터베이스에 보관합니다. 그중 COLUMNS 테이블에는 서버 내 모든 테이블의 열 정보(TABLE_NAME, COLUMN_NAME, DATA_TYPE 등)가 담겨 있으므로, 여기에 길이 조건을 적용하면 원하는 결과를 얻을 수 있습니다.
2. HAVING 절을 사용한 쿼리
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
HAVING LENGTH(COLUMN_NAME) > 5;
LENGTH() 함수가 열 이름의 길이를 계산하고, HAVING 절이 그 값이 5보다 큰 행만 걸러냅니다. MySQL에서는 GROUP BY 없이도 HAVING을 사용할 수 있기 때문에 이런 형태의 필터링이 가능합니다.
3. 실행 결과 예시
실제로 위 쿼리를 실행하면 다음과 같은 형태의 결과가 출력됩니다. 아래는 전체 55행 중 일부 발췌본입니다.
+-------------------+-------------------------+ | TABLE_NAME | COLUMN_NAME | +-------------------+-------------------------+ | DemoTable | UserId | | DemoTable | EndDate | | DemoTable | StartDate | | DemoTable | StudentFavouriteSubject | | DemoTable | StudentFirstName | | DemoTable | StudentId | | DemoTable | ShippingDate | | DemoTable | ArrivalDate | | DemoTable | CustomerAllProductPrice | | DemoTable | StudentCountryName | | insertcurrentdate | currentDate | | student | first_name | | student | last_name | +-------------------+-------------------------+ 55 rows in set (0.01 sec)
4. 실무에서 알아두면 좋은 팁
- 특정 데이터베이스로 범위 제한: 서버 전체가 아니라 특정 DB만 검색하려면
WHERE TABLE_SCHEMA = '데이터베이스명'조건을 추가하세요. - WHERE 절 사용도 가능: 집계가 필요 없는 단순 필터링이라면
WHERE CHAR_LENGTH(COLUMN_NAME) > 5처럼 WHERE 절을 쓰는 것이 표준적이며 성능 면에서도 더 유리합니다. - LENGTH() vs CHAR_LENGTH():
LENGTH()는 바이트 수를 반환합니다. 따라서 한글처럼 멀티바이트 문자가 포함된 열 이름을 다룬다면 문자 수를 세는CHAR_LENGTH()를 사용하는 것이 안전합니다.
마무리
INFORMATION_SCHEMA.COLUMNS를 조회하면 별도의 관리 도구 없이 SQL 한 문장으로 스키마 전체의 열 이름을 분석할 수 있습니다. 네이밍 규칙 점검이나 리팩토링 대상 선정 등에 적극적으로 활용해 보세요.