데이터 타입,
값에 맞는 그릇 고르기
지난 강의에서 컬럼은 어떤 값을 기록할지 정한 약속이라고 했습니다. 여기에 약속이 하나 더 필요해요 — 그 값이 숫자인지, 글자인지, 날짜인지 정하는 것. 이렇게 값에 맞는 그릇을 정하는 걸 데이터 타입이라고 합니다.
이번 섹션의 여정
완료 ✓
완료 ✓
지금 여기
기본키 · 외래키 · 테이블 만들기
오늘 살펴볼 네 가지 그릇
타입은 ‘가능한 일’을 정합니다
데이터 타입은 값의 모양만 정하는 게 아닙니다. 타입에 따라 그 값으로 할 수 있는 계산과 비교가 달라져요. 숫자는 더하거나 크기를 비교하고, 날짜는 며칠 차이인지 계산할 수 있습니다.
| 이 값은 | 타입 | 할 수 있는 일 |
|---|---|---|
| 89000 | 숫자 (INT) | 더하기 · 크기 비교 · 합계 |
| '89000' | 글자 (VARCHAR) | 글자 그대로 보관 · 글자 순서로 비교 |
데이터 타입은 값의 겉모양이 아니라, 그 값으로 무엇을 할 것인지에 맞춰 고릅니다.
숫자 타입 — INT 와 DECIMAL
우리 실습 스키마에서는 정수를 담을 때 INT를 사용합니다.
| 테이블 | 컬럼 | 타입 | 값 예시 |
|---|---|---|---|
| members | age | INT | 35 |
| products | price | INT | 89000 |
| order_items | quantity | INT | 1 |
우리 상품 가격처럼 원 단위 정수만 저장한다면 INT가 잘 맞습니다. 반면 할인율을 12.5%처럼 소수점 아래까지 정확히 저장해야 한다면 DECIMAL을 사용해요.
정리하면 — 정수는 INT, 소수점 아래까지 정확히 저장할 값은 DECIMAL.
문자열 타입 — VARCHAR 와 CHAR
다음은 글자를 담는 문자열 타입입니다.
| 컬럼 | 타입 | 값 예시 | 왜 이 타입인가 |
|---|---|---|---|
| member_name | VARCHAR(50) | 김철수 | 이름마다 길이가 다름 |
| product_name | VARCHAR(100) | 무선 이어폰 | 상품명은 더 길 수 있음 |
| gender | CHAR(1) | M | 항상 한 글자 (M/F) |
VARCHAR는 길이가 달라질 수 있는 문자열을 담고, CHAR는 길이가 고정된 값에 씁니다. gender는 M이나 F처럼 항상 한 글자라서 CHAR(1)을 쓴 거예요.
여기서 중요한 지점 — 숫자처럼 보인다고 반드시 숫자 타입을 쓰는 건 아닙니다.
전화번호 01012345678 을 어디에 담아야 할까요?
맨 앞 0이 사라진다1012345678 이 된다
+ 나 하이픈아예 넣을 수 없다
계산더할 일도 없는데 숫자로 둘 이유가 없다
원래 모양 그대로01012345678
+82, 010-1234-5678모두 담을 수 있다
용도에 맞음찾고 표시할 값이지 계산할 값이 아니다
계산하지 않는 번호는 숫자가 아니라 문자열일 수 있습니다.
날짜·시간과 참·거짓
가입일인 joined_at과 주문일인 ordered_at은 DATE입니다.
| 얻는 것 | 설명 |
|---|---|
| 잘못된 날짜 차단 | 2025-13-40 같은 값이 들어올 수 없다 |
| 순서 비교 | 어느 날이 더 이른지 정확히 비교된다 |
| 기간 계산 | 두 날짜가 며칠 차이인지 계산할 수 있다 |
마지막은 참과 거짓입니다. 예를 들어 회원이 활동 중인지 나타내는 가상의 is_active 컬럼은 답이 참과 거짓 두 가지뿐이죠. 이럴 때 BOOLEAN을 사용할 수 있습니다. 보통 참은 TRUE 또는 1, 거짓은 FALSE 또는 0으로 표현합니다.
is_active 와 전화번호 컬럼은 실제 shop 스키마에 없습니다. 타입 선택을
설명하기 위한 가상의 컬럼이에요.
타입을 잘못 고르면 생기는 일
| 이렇게 저장하면 | 이런 문제가 생깁니다 |
|---|---|
| 가격을 문자열로 | 숫자 크기가 아닌 글자 순서로 비교된다 |
| 전화번호를 숫자로 | 맨 앞의 0이 사라진다 |
| 날짜를 문자열로 | 2025-13-40 처럼 없는 날짜도 들어간다 |
타입을 고르는 네 가지 질문
새 컬럼의 타입을 고를 때는 이렇게 질문하세요.
| 질문 | 그렇다면 |
|---|---|
| 계산하거나 크기를 비교하는가? | 숫자 타입 — INT · DECIMAL |
| 앞의 0이나 특수문자 모양을 지켜야 하는가? | 문자열 — VARCHAR · CHAR |
| 날짜 계산이 필요한가? | 날짜 타입 — DATE · DATETIME |
| 답이 참과 거짓뿐인가? | BOOLEAN |
값을 비워도 되는지는 데이터 타입이 정하지 않습니다. 그건 3-2에서 배운
NULL · NOT NULL 로 따로 정해요. 타입과 빈값 규칙은 별개의 약속입니다.
한눈에 정리
| 타입 | 담는 값 | shop 에서는 |
|---|---|---|
| INT | 소수점 없는 정수 | age · price · quantity |
| DECIMAL | 소수점까지 정확한 숫자 | 할인율 12.5% 같은 값 |
| VARCHAR(n) | 길이가 달라지는 글자 | member_name · product_name |
| CHAR(n) | 길이가 고정된 글자 | gender (M/F) |
| DATE | 날짜 | joined_at · ordered_at |
| BOOLEAN | 참 / 거짓 두 가지 | 가상의 is_active |
이제 컬럼의 이름과 규칙, 타입까지 읽을 수 있게 됐습니다. 그런데 회원이 20명인데 이름이 같은 사람이 둘 있다면 — 어떻게 한 명을 정확히 가리킬 수 있을까요? 그 이야기가 다음 강의입니다.