오늘은 PostgreSQL에서 숫자 데이터 타입에 대해 얘기해볼 거야. 혹시 "42" 같은 숫자, 돈 계산, 아니면 밀리초 같은 걸 저장하려고 고민해본 적 있다면, 바로 여기서 답을 찾을 수 있어. 어떤 타입이 어떤 상황에 맞는지 같이 알아보고, 너랑 네 데이터가 편하게 지낼 수 있게 해줄게.
PostgreSQL에서 숫자 데이터 타입은 세 가지 주요 그룹으로 나뉘어:
- 정수 (
INTEGER): 소수점 없는 숫자를 저장할 때 써. 익숙한 1, 42, -7 같은 숫자들! - 정확한 숫자 (
NUMERIC): 소수점 아래 자릿수를 딱 정해서 저장할 수 있어. 돈 계산처럼 정확도가 생명일 때 완전 필수! - 부동 소수점 숫자 (
REAL): 엄청 크거나 엄청 작은 숫자를 저장할 때.NUMERIC보단 덜 정확하지만, 과학 계산엔 딱이야.
INTEGER 타입
INTEGER는 정수용 데이터 타입이야. 소수점 없는 숫자를 저장할 때 쓰면 돼. PostgreSQL에서는 INTEGER가 세 가지 버전이 있어서, 다양한 범위를 커버할 수 있어:
SMALLINT: 작은 정수 타입. 범위: -32,768 ~ 32,767.INTEGER(또는INT): 표준 정수 타입. 범위: -2,147,483,648 ~ 2,147,483,647.BIGINT: 진짜 큰 숫자용. 범위: -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807.
예를 들어, students라는 테이블에 학생들의 이름, 나이, 받은 학점(크레딧) 정보를 저장한다고 해보자:
| id | name | age | credits |
|---|---|---|---|
| 1 | Otto Nate | 21 | 30 |
| 2 | Maria Chi | 22 | 45 |
| 3 | Peter Val | 20 | 60 |
| 4 | Anna Song | 23 | 50 |
| 5 | Sophie Zhang | 21 | 35 |
이제 간단한 SQL 쿼리로 학생들의 이름, 나이, 크레딧을 뽑아보자:
SELECT name, age, credits
FROM students;
결과:
| name | age | credits |
|---|---|---|
| Otto Nate | 21 | 30 |
| Maria Chi | 22 | 45 |
| Peter Val | 20 | 60 |
| Anna Song | 23 | 50 |
| Sophie Zhang | 21 | 35 |
INTEGER를 언제 써야 할까?
- 아이디(
id), 주문 번호 같은 식별자 저장할 때. - 뭔가의 개수(예: 창고에 있는 상품 수, 학생 수) 저장할 때.
NUMERIC 타입
NUMERIC는 소수점 자릿수를 딱 정해서 정확하게 저장하는 타입이야. 예를 들어 123.456 같은 숫자를 저장해야 하고, 소수점 한 자리라도 틀리면 평판(혹은 돈)이 날아가는 상황이라면 NUMERIC를 써야 해.
선언 형식: NUMERIC(precision, scale), 여기서:
precision— 전체 자리수(소수점 앞뒤 다 포함).scale— 소수점 아래 자리수.
예를 들어 NUMERIC(6, 2)는 최대 6자리 숫자 중 2자리가 소수점 아래로 들어갈 수 있어.
이제 금융 거래를 기록하는 테이블을 만들어보자:
| id | description | amount |
|---|---|---|
| 1 | 수업료 결제 | 2345.67 |
| 2 | 월간 장학금 | 500.00 |
| 3 | 실험실 비용 | 145.99 |
| 4 | 도서관 벌금 | 12.75 |
| 5 | 컨퍼런스 등록 | 320.50 |
이제 트랜잭션 목록을 뽑아보자:
SELECT description, amount
FROM transactions;
결과:
| description | amount |
|---|---|
| 수업료 결제 | 2345.67 |
| 월간 장학금 | 500.00 |
| 실험실 비용 | 145.99 |
| 도서관 벌금 | 12.75 |
| 컨퍼런스 등록 | 320.50 |
NUMERIC를 언제 써야 할까?
- 돈 계산(상품 가격, 월급 등).
- 정확한 측정값(무게, 길이 등) 저장할 때.
measurements 테이블
| id | mass - REAL | height - REAL |
|---|---|---|
| 1 | 70.5 | 1.83 |
| 2 | 64.2 | 1.75 |
| 3 | 82.3 | 1.92 |
| 4 | 55.0 | 1.60 |
이제 값을 뽑아보자:
SELECT mass, height
FROM measurements;
결과:
| mass | height |
|---|---|
| 70.5 | 1.83 |
| 64.2 | 1.75 |
| 82.3 | 1.92 |
| 55.0 | 1.60 |
REAL을 언제 써야 할까?
- 과학 계산(원자 질량, 달까지 거리 등).
- 오차가 허용되는 데이터 모델링.
숫자 타입 비교: 언제 뭘 써야 할까?
| 데이터 타입 | 범위 | 정확도 | 사용 예시 |
|---|---|---|---|
SMALLINT |
-32,768 ~ 32,767 | 정수 | 작은 숫자(나이, 평점 등). |
INTEGER |
-2,147,483,648 ~ 2,147,483,647 | 정수 | 아이디, 개수 등. |
BIGINT |
-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 정수 | 진짜 큰 숫자. |
NUMERIC |
precision과 scale에 따라 다름 |
정확한 소수 | 금융, 측정값 등. |
REAL |
약 6자리 소수 | 부동 소수점 | 대략적/과학 데이터. |
DOUBLE PRECISION |
약 15자리 소수 | 고정밀 부동 소수점 | 과학, 연구 등. |
별칭(Alias)
PostgreSQL에서는 많은 숫자 타입에 별칭(alias)이 있어 — 같은 타입인데 이름만 다르고, 가독성이나 다른 DB와의 호환성을 높여줘.
여기 숫자 타입 별칭에 대한 짧고 쉬운 가이드!
정수 타입 별칭
| 별칭 | 실제 타입 | 크기 | 범위 |
|---|---|---|---|
INT |
INTEGER |
4바이트 | −2,147,483,648 ~ 2,147,483,647 |
INT4 |
INTEGER |
4바이트 | (옛날 별칭) |
SMALLINT |
SMALLINT |
2바이트 | −32,768 ~ 32,767 |
INT2 |
SMALLINT |
2바이트 | |
BIGINT |
BIGINT |
8바이트 | −9 퀸틸리언 ~ +9 퀸틸리언 |
INT8 |
BIGINT |
8바이트 |
정확한 숫자 별칭
| 별칭 | 실제 타입 | 용도 |
|---|---|---|
DEC |
NUMERIC |
SQL 표준 별칭 |
DECIMAL |
NUMERIC |
똑같음 |
부동 소수점 숫자 별칭
| 별칭 | 실제 타입 | 정확도 |
|---|---|---|
FLOAT |
DOUBLE PRECISION |
~15자리(기본) |
FLOAT(24) |
REAL |
~6자리 |
FLOAT(53) |
DOUBLE PRECISION |
~15자리 |
FLOAT8 |
DOUBLE PRECISION |
옛날 별칭 |
FLOAT4 |
REAL |
옛날 별칭 |
자주 하는 실수들
숫자 타입을 쓸 때 이런 함정에 빠질 수 있어:
너무 작은 데이터 타입을 고르는 실수. 사람 나이에 SMALLINT를 쓰면, "매트릭스"의 로봇처럼 나이가 수백만 년인 존재는 슬퍼할지도 몰라.
반올림 때문에 데이터 손실. REAL로 돈 계산하면, 몇 원(혹은 몇 센트)이 사라질 수 있어. 그러면 신뢰도도 같이 사라질 수 있지.
다른 타입끼리 비교. INTEGER랑 REAL을 비교하면, 부동 소수점 특성 때문에 예상치 못한 결과가 나올 수 있어.
GO TO FULL VERSION