PostgreSQL에서 텍스트 데이터를 다룰 때 주인공 세 명이 있어: CHAR, VARCHAR, TEXT. 각각 특징, 장점, 단점이 있으니까 하나씩 알아보자.
CHAR(n)
CHAR 또는 character는 길이가 딱 n으로 고정된 문자열이야. 만약 데이터가 그보다 짧으면, 자동으로 빈칸(스페이스)으로 채워져.
예시:
| id | code - CHAR(5) |
|---|---|
| 1 | ''ABC'' |
이 타입은 모든 문자열이 똑같은 길이여야 할 때(예: 코드, 바코드, 고정 길이 식별자 등)에 쓰기 좋아.
근데 길이가 가변적인 텍스트를 다룰 땐, 남는 빈칸이 DB 공간만 낭비하게 돼.
VARCHAR(n)
VARCHAR 또는 variable character는 최대 n글자까지 저장할 수 있는 가변 길이 문자열이야.
예시:
| id | username - VARCHAR(10) |
|---|---|
| 1 | ''Alice'' |
이 타입은 실제 텍스트만 저장해서 공간을 효율적으로 써. 단점은 최대 길이 제한을 꼭 정해야 한다는 거야. 만약 그 제한을 넘으면 DB가 에러를 던져.
TEXT
TEXT는 길이 제한이 없는 문자열 타입이야. 텍스트가 얼마나 길어질지 모를 때 자주 써.
예시:
| id | content - TEXT |
|---|---|
| 1 | ''This is a long piece of text. No limits!'' |
장점: 길이에 상관없이 아무 텍스트나 저장할 수 있어서 신경 쓸 게 없어.
단점: 제한이 없다 보니, 텍스트 데이터가 너무 커지면 DB가 비효율적으로 될 수 있어.
텍스트 데이터 타입 비교
텍스트를 다룰 때, 어떤 타입이 상황에 맞는지 아는 게 중요해. CHAR, VARCHAR, TEXT의 주요 차이점은 이래:
| 데이터 타입 | 길이 | 성능 | 언제 써? |
|---|---|---|---|
CHAR(n) |
고정 | 고정 길이 문자열에선 더 빠름 | 고정 길이 코드(예: ISO 코드 등)에 적합 |
VARCHAR(n) |
최대 길이 n |
길이 제한이 있을 때 TEXT보다 빠름 |
최대 길이가 정해진 가변 길이 문자열에 적합 |
TEXT |
무제한 | 가장 범용적임 | 길이를 예측하기 힘든 긴 텍스트에 적합 |
실전 예시
그럼 실제로 이 데이터 타입들을 어떻게 쓰는지 예시로 보자.
예시 1: 고정 길이 코드에 CHAR 사용
예를 들어, ISO 3166-1 alpha-3 표준에 따라 도시 코드를 저장해야 하는 DB가 있다고 해보자. 각 코드는 무조건 3글자여야 해.
| city_id | city_name - VARCHAR(50) | iso_code - CHAR(3) |
|---|---|---|
| 1 | New York | NYC |
| 2 | Los Angeles | LAX |
| 3 | Chicago | CHI |
여기서 CHAR(3)가 딱이야. 각 도시의 ISO 코드는 항상 3글자니까.
예시 2: 사용자 이름에 VARCHAR 사용
사용자 이름은 VARCHAR 쓰기 좋은 케이스야. 보통 이름은 길이가 다 다르지만, 50글자를 넘진 않을 거라 가정할 수 있지.
| user_id | username - VARCHAR(50) | email - VARCHAR(50) |
|---|---|---|
| 1 | Alice | alice@example.com |
| 2 | Bob | bob@example.net |
여기서 VARCHAR는 실제 문자열이 50글자보다 짧으면 공간을 아낄 수 있어.
예시 3: 설명 저장에 TEXT 사용
블로그가 있다고 해보자. 각 포스트마다 긴 설명을 저장해야 해. 이럴 땐 TEXT가 최적이야.
| post_id | title - VARCHAR(100) | content - TEXT |
|---|---|---|
| 1 | Post 1 | This is a very long blog post content that goes on and on... |
텍스트 길이를 미리 알 수 없을 땐 TEXT가 딱이야.
4. 추가 팁 & 주의할 점
텍스트 타입을 쓸 때는 몇 가지 주의할 점이 있어. 실수하지 않으려면 아래를 참고해!
문제: CHAR는 빈칸을 추가함
CHAR 타입 필드에서 빈칸을 신경 안 쓰고 문자열을 비교하면, 예상치 못한 결과가 나올 수 있어.
SELECT * FROM cities WHERE iso_code = 'NYC';
-- 빈칸을 제거하지 않으면 결과가 없음
해결 방법: TRIM() 함수를 써서 빈칸을 지워줘.
SELECT * FROM cities WHERE TRIM(iso_code) = 'NYC';
문제: VARCHAR 길이 제한 때문에 에러가 날 수 있음
VARCHAR 필드에 최대 길이보다 긴 문자열을 넣으려고 하면 DB가 에러를 던져.
INSERT INTO users (username, email) VALUES ('A_username_that_is_too_long_for_field', 'test@example.com');
-- 에러
해결 방법: 길이 제한(n)이 실제로 필요한 만큼인지 확인하거나, 제한이 필요 없으면 TEXT를 써.
문제: TEXT가 DB를 비대하게 만들 수 있음
TEXT는 제한 없이 데이터를 저장해서, 테이블이 너무 커지고 인덱싱이 어려워질 수 있어.
예방 방법: TEXT 타입 컬럼을 인덱싱할 일이 많으면, 제한된 VARCHAR를 쓰는 것도 고려해봐.
GO TO FULL VERSION