2.2Complex Datatypes
PostgreSQL의 데이터 타입
데이터 타입
PostgreSQL은 매우 다양한 데이터 타입을 지원한다. 이 중 자주 사용되는 타입들 위주로 알아보자.
1. 숫자(Numbers)
일반적인 관습
용도 | 추천 타입 |
---|---|
기본 ID | serial (자동 증가) |
소수점 없음 | integer |
정확한 소수점 | numeric (ex: 은행 계좌 잔액, 과학 계산) |
근사 소수점 | double precision (ex: 호수의 물을 리터 단위로 표시할때) |
소수점 없는 정수 타입
타입 | 범위 |
---|---|
smallint | -32,768 ~ +32,767 |
integer | -2,147,583,648 ~ +2,147,583,647 |
bigint | 더 큰 정수 지원 |
자동 증가 정수 타입
타입 | 범위 |
---|---|
smallserial | 1 ~ 32,767 |
serial | 1 ~ 2,147,583,647 |
bigserial | 매우 큰 숫자까지 |
소수점 있는 타입 (정밀도에 따라 선택)
타입 | 범위 |
---|---|
numeric , decimal | 매우 정확하다. 소수점 전 131,072자리, 후 16,383자리까지 지원 |
real | 부동 소수점. 약 1E-37 ~ 1E37 |
double precision | 더 넓은 범위. 약 1E-307 ~ 1E308, 최소 15자리수 정확도 |
float | real 또는 double precision 의 alias |
2. 날짜/시간 (Date/Time)
PostgreSQL은 날짜/시간 포맷에 매우 유연해서, 아래의 날짜 형식들이 모두 인식된다..
- 예를 들면, 아래는 전부 1980-11-20으로 인식한다.
- 1980-11-20
- Nov-20-1980
- 20-Nov-1980
- 1980-November-20
- November 20, 1980
주요 타입
타입 | 설명 |
---|---|
DATE | 날짜만 |
TIME / TIME WITHOUT TIME ZONE | 두 타입은 같다. TIME이 후자의 alias다. |
TIME WITH TIME ZONE | 타입존 포함(ex.05:23PM PST -> 17:23-08:00) |
TIMESTAMP WITH TIME ZONE(timestamptz ) | 날짜 + 시간 + 타임존 |
INTERVAL | 두 시점 사이의 기간(duration). 날짜/시간 연산할 때 사용된다. |
3. 문자 (Character)
타입 | 설명 |
---|---|
CHAR(5) | 고정 길이 문자(길이 부족하면 공백으로 채운다) |
VARCHAR | 가변 길이 문자열(길이 제한 없음) |
VARCHAR(40) | 최대 40자까지 허용. 초과 시 잘린다. |
TEXT | 가변 길이 문자열. 길이 제한 사실상 없음. |
4. 불리언 (Boolean)
PostgreSQL은 BOOLEAN으로 타입 지정시 아래와 같은 값들을 각각 TRUE/FALSE로 인식한다.
- TRUE 값
- true
- 'yes'
- on
- 1
- t
- y
- FALSE 값
- false
- 'no'
- off
- 0
- f
- n
- 참고로,
NULL
은 불리언 컬럼에 값이 지정되지 않았을 때 나타나는 미지정 상태를 의미하며 FALSE값이 아니다!
5. 기타 타입들
타입 | 설명 |
---|---|
Currency | 화폐 |
Binary | 바이너리 파일 |
UUID | 고유 식별자(Universally Unique ID) |
XML | XML 데이터 |
Arrays | 배열 형태 데이터 |
Range | 숫자/날짜 구간 범위 저장 |
Geometric | 점, 선, 다각형 등 공간 좌표 데이터 |
JSON | JSON 데이터 |
🤠 개인 탐구
double precision
이름은 굉장히 정확할 것처럼 생겼지만 실제로는 근사값인 데이터 타입인데, 왜 이런 이름이 붙었을까?
double precision
은 부동 소수점(floating point) 방식 중 하나인 배정밀도(double precision floating point)를 의미한다.
IEEE 754라는 국제 표준에서, single precision
은 32비트(float), double precision
은 64비트로 더 정밀한 float를 의미하게 정의했다. 이 둘 다 부동 소수점 방식, 즉 소수점 값을 이진수 기반으로 근사해서 표현하는 방식이다.
소수점의 '정확도'
**정확도 vs 성능(속도)**의 트레이드오프 때문에, 소수점이 반드시 아주 정확한게 좋은 것은 아니다. numeric
은 정수처럼 기수 기반으로 소수점 계산을 하고, double precision
은 이진 기반으로 소수점 계산으로 하기 때문에 속도 측면에서 후자가 훨씬 유리하다.
예를 들어, 통계나 시뮬레이션처럼 대략적으로 빠르게 결과를 얻어야 하는 경우는 성능을 중시하는 데이터 타입으로 설정하는게 유리하다. 반대로, 속도를 희생하더라도 금융이나 과학 계산처럼 정밀도가 중요하면 numeric
을 쓰는게 좋다.
smallint와 integer의 지원 범위
smallint
는 32,768, integer
은 약 21억의 제한이 있다. 이 숫자들은 어떻게 나온 것일까?
smallint
는 16비트 정수다. 1비트는 부호(+, -)로 쓰고, 나머지 15비트로 숫자를 표현하게 되면 -2^15(=32,768)부터 2^15 -1(32,767)까지 표현이 가능하다.
integer
는 32비트 정수다. 마찬가지로 1비트는 부호로 쓰고, 나머지 31비트로 숫자를 표현하게 되면 -2^31(=약 -21억)부터 2^31-1(약 21억)까지 표현이 가능하다.
bigint
는 64비트 정수다. 이것도 마찬가지로 1비트는 부호로, 나머지 63비트로 숫자를 표현하게 되면 약 -922경 ~ 922경까지 표현이 가능하다.