sungyup's.

PostgreSQL / PostgreSQL / 2.2 Complex Datatypes

2.2Complex Datatypes

PostgreSQL의 데이터 타입

데이터 타입

PostgreSQL은 매우 다양한 데이터 타입을 지원한다. 이 중 자주 사용되는 타입들 위주로 알아보자.

1. 숫자(Numbers)

일반적인 관습

용도추천 타입
기본 IDserial(자동 증가)
소수점 없음integer
정확한 소수점numeric(ex: 은행 계좌 잔액, 과학 계산)
근사 소수점double precision(ex: 호수의 물을 리터 단위로 표시할때)

소수점 없는 정수 타입

타입범위
smallint-32,768 ~ +32,767
integer-2,147,583,648 ~ +2,147,583,647
bigint더 큰 정수 지원

자동 증가 정수 타입

타입범위
smallserial1 ~ 32,767
serial1 ~ 2,147,583,647
bigserial매우 큰 숫자까지

소수점 있는 타입 (정밀도에 따라 선택)

타입범위
numeric, decimal매우 정확하다. 소수점 전 131,072자리, 후 16,383자리까지 지원
real부동 소수점. 약 1E-37 ~ 1E37
double precision더 넓은 범위. 약 1E-307 ~ 1E308, 최소 15자리수 정확도
floatreal 또는 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)
XMLXML 데이터
Arrays배열 형태 데이터
Range숫자/날짜 구간 범위 저장
Geometric점, 선, 다각형 등 공간 좌표 데이터
JSONJSON 데이터

🤠 개인 탐구

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경까지 표현이 가능하다.