MySQL에서 문자열을 저장할 때 가장 많이 비교되는 데이터 타입은 CHAR와 VARCHAR입니다. 두 타입 모두 문자열을 저장할 수 있고 최대 길이를 지정할 수 있다는 공통점이 있지만, 내부적인 저장 방식이 다르기 때문에 어떤 것을 선택할지는 저장하려는 데이터의 성격에 따라 달라집니다.
CHAR와 VARCHAR의 핵심 차이
CHAR는 고정 길이(fixed-length) 문자열 타입입니다. 선언된 길이만큼 공간을 항상 확보하며, 입력된 값이 그보다 짧으면 남는 공간은 공백으로 채워집니다.
VARCHAR는 가변 길이(variable-length) 문자열 타입입니다. 실제 저장되는 값의 길이에 맞춰 공간을 사용하되, 그 대신 값 앞에 길이 정보를 나타내는 1바이트의 접두사(length prefix)가 추가됩니다.
언제 CHAR를 사용해야 할까?
데이터의 크기가 항상 일정한 경우에는 CHAR가 더 유리합니다. 예를 들어 'Y'와 'N'처럼 한 글자로 표현되는 플래그(flag) 값을 저장한다고 가정해 보겠습니다.
- CHAR(1): 데이터 1바이트만 저장됩니다.
- VARCHAR(1): 데이터 1바이트 + 길이 접두사 1바이트 = 총 2바이트가 저장됩니다.
VARCHAR는 길이 정보를 위한 추가 바이트를 소모하기 때문에, 이처럼 길이가 고정된 데이터에는 오히려 불필요한 공간 낭비가 발생합니다. 따라서 국가 코드('KR', 'US')나 상태 코드처럼 항상 길이가 같은 데이터에는 CHAR를 사용하는 것이 좋습니다.
언제 VARCHAR를 사용해야 할까?
반대로 저장되는 값의 길이가 제각각이라면 VARCHAR가 적합합니다. 사용자 이름, 비밀번호, 이메일 주소처럼 길이가 들쭉날쭉한 데이터를 VARCHAR로 저장하면 실제 데이터 크기만큼만 공간을 사용하기 때문에 저장 공간을 낭비하지 않습니다.
정리
- 길이가 항상 동일한 데이터(플래그, 국가 코드 등) → CHAR
- 길이가 가변적인 데이터(사용자명, 비밀번호 등) → VARCHAR
결국 두 타입 중 무엇을 선택할지는 "저장할 데이터의 길이가 고정적인가?"라는 질문 하나로 판단할 수 있습니다. 이 기준만 기억하면 MySQL 테이블을 설계할 때 상황에 맞는 최적의 타입을 쉽게 선택할 수 있습니다.