CodeGym /행동 /SQL SELF /텍스트 데이터 타입: CHAR, VARCHAR, <...

텍스트 데이터 타입: CHAR, VARCHAR, TEXT

SQL SELF
레벨 15 , 레슨 2
사용 가능

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를 쓰는 것도 고려해봐.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION