PostgreSQL의 기본 데이터 타입은 크게 숫자, 문자, 날짜/시간, 논리형, 배열, JSON, 범위 타입 등으로 나눌 수 있습니다.
1. 숫자 타입 (Numeric Types)
정수형 (Integer Types)
타입 | 크기 | 범위 |
smallint | 2바이트 | -32,768 ~ 32,767 |
integer 또는 int | 4바이트 | -2,147,483,648 ~ 2,147,483,647 |
bigint | 8바이트 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
실수형 (Floating-Point Types)
타입 | 크기 | 설명 |
real 또는 float4 | 4바이트 | 단정도 부동소수점 (소수점 이하 약 6자리) |
double precision 또는 float8 | 8바이트 | 배정도 부동소수점 (소수점 이하 약 15자리) |
고정소수점 (Fixed-Precision Numbers)
타입 | 크기 | 설명 |
numeric(p, s) | 가변적 | 정밀한 소수 계산 가능 (p: 전체 자리수, s: 소수점 이하 자리수) |
decimal(p, s) | 가변적 | numeric과 동일 |
🔹 numeric과 decimal은 금융 계산처럼 정밀한 연산이 필요한 경우 사용됩니다.
2. 문자 타입 (Character Types)
타입 | 크기 | 설명 |
char(n) | 고정 크기 | n개의 고정된 길이 (부족하면 공백으로 채움) |
varchar(n) | 가변 크기 | n 길이까지 저장 가능 (길이가 다르면 공간 절약) |
text | 가변 크기 | 길이 제한 없음 |
🔹 text 타입은 사실상 varchar(n)과 동일하지만, 길이 제한이 없어 더 자유롭게 사용할 수 있습니다.
3. 날짜 및 시간 타입 (Date/Time Types)
타입 | 크기 | 설명 |
date | 4바이트 | 연-월-일 (YYYY-MM-DD) |
time | 8바이트 | 시-분-초 (HH:MI:SS) |
timestamp | 8바이트 | 날짜 + 시간 (YYYY-MM-DD HH:MI:SS) |
timestamptz | 8바이트 | timestamp + 타임존 정보 포함 |
interval | 16바이트 | 시간 간격 (예: 1 year 2 months) |
🔹 timestamptz(timestamp with time zone)를 사용하면 자동으로 UTC 기준으로 변환하여 저장되므로, 다국적 서비스에서는 timestamptz를 권장합니다.
4. 논리형 (Boolean Type)
타입 | 크기 | 설명 |
boolean | 1바이트 | TRUE, FALSE, NULL |
🔹 boolean 타입은 TRUE(1), FALSE(0) 값을 가지며, t, f, y, n, on, off 등의 값도 허용됩니다.
5. 배열 (Array Type)
PostgreSQL은 기본적으로 배열을 지원합니다.
CREATE TABLE users (
id serial PRIMARY KEY,
hobbies TEXT[]
);
🔹 배열 사용 예:
INSERT INTO users (hobbies) VALUES (ARRAY['reading', 'coding', 'traveling']);
SELECT * FROM users WHERE 'coding' = ANY(hobbies);
6. JSON 타입
타입 | 설명 |
json | 원본 JSON 문자열을 저장 |
jsonb | 바이너리 형식으로 저장 (색인 및 검색 최적화) |
🔹 jsonb는 내부적으로 파싱하여 저장하므로 검색 속도가 더 빠릅니다.
CREATE TABLE products (
id SERIAL PRIMARY KEY,
info JSONB
);
INSERT INTO products (info) VALUES ('{"name": "Laptop", "price": 1500}');
SELECT info->>'name' FROM products; -- "Laptop"
7. UUID (Universally Unique Identifier)
타입 | 설명 |
uuid | 전역적으로 유일한 식별자 |
🔹 uuid는 보안이 중요한 환경에서 사용되며, PostgreSQL에서 gen_random_uuid() 함수를 이용해 생성할 수 있습니다.
CREATE TABLE users (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
name TEXT
);
8. 범위 타입 (Range Types)
PostgreSQL은 연속적인 값의 범위를 다룰 수 있는 데이터 타입을 제공합니다.
타입 | 설명 |
int4range | integer 범위 |
int8range | bigint 범위 |
numrange | numeric 범위 |
tsrange | timestamp 범위 |
tstzrange | timestamptz 범위 |
daterange | date 범위 |
🔹 사용 예:
CREATE TABLE reservations (
id SERIAL PRIMARY KEY,
room_number INT,
booking_period DATERANGE
);
INSERT INTO reservations (room_number, booking_period)
VALUES (101, '[2025-03-01, 2025-03-10)');
SELECT * FROM reservations WHERE booking_period @> '2025-03-05';
@> 연산자는 특정 날짜가 범위에 포함되는지 확인합니다.
9. 기타 데이터 타입
타입 | 설명 |
money | 화폐 단위 (통화 설정이 필요함) |
cidr, inet, macaddr | 네트워크 주소 저장 |
bit(n), bit varying(n) | 비트 문자열 |
xml | XML 데이터 저장 |
📌 정리
PostgreSQL은 다양한 데이터 타입을 지원하며, 주로 다음을 사용합니다.
- 정수형: smallint, integer, bigint
- 실수형: real, double precision, numeric
- 문자형: char(n), varchar(n), text
- 날짜/시간: date, timestamp, timestamptz
- 논리형: boolean
- 배열: TEXT[], INT[]
- JSON: json, jsonb
- 범위 타입: daterange, numrange
- UUID, XML, 네트워크 주소, 화폐 타입 등도 지원
PostgreSQL의 특성에 맞게 적절한 타입을 선택하여 데이터베이스 성능과 관리 효율성을 높일 수 있습니다! 🚀
'데이터베이스' 카테고리의 다른 글
PostgreSQL 주의할점 (0) | 2025.03.14 |
---|---|
PostgreSQL에서 VARCHAR(n)을 작게 설정해도 큰 저장 공간을 차지하는가? (0) | 2025.03.13 |
Redis TTL (Time-To-Live) 이란? (0) | 2025.03.03 |
Redis RDB vs AOF 비교 (0) | 2025.03.03 |
LRU (Least Recently Used)와 LFU (Least Frequently Used) 알고리즘 (0) | 2025.03.03 |