본문 바로가기

Information Technology/DB

[PostgreSQL] 자료형 - numeric, real, 그리고 double

이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요;)


테이블을 만들고, 테이블을 구성하는 칼럼을 만들고, 칼럼을 구성하는 데이터의 타입을 정해줘야 합니다.

이번 포스팅에서는 여러 데이터 타입 중 numeric, real, 그리고 double에 대해 알아보겠습니다.

 

Numeric

numeric 데이터 타입은 정수 또는 숫자를 저장할 수 있습니다.

특징이 있다면 함수에서 매개변수를 설정할 수 있듯이, numeric 데이터 타입도 자신이 설정하려는 값을 precision과 scale이라는 변수를 통해 전달할 수 있다는 점입니다.

위의 코드를 보면 테이블을 구성하고 칼럼을 만들어줄 때 데이터 타입을 numeric(20, 5)라고 설정했습니다.

여기서 20은 소수점 앞으로 최대 몇 자리의 숫자까지 표현할 수 있는지,

5는 소수점 뒤로 몇 개의 소수를 표현할 수 있는지를 의미합니다.

즉 여기서 numeric_column은 소수점 앞으로는 최대 20자리의 숫자와 소수점 뒤로는 최대 5개의 소수를 표현할 수 있습니다.

number_data_types 테이블을 만들어 준 뒤, INSERT INTO를 통해 생성한 각 칼럼에 3가지 값을 저장했습니다. 그리고 SELECT * FROM number_data_types를 통해 테이블에 저장된 정보를 쭉 뽑아보면

위와 같이 INSERT를 통해 저장한 데이터를 볼 수 있습니다.

주의 깊게 봐야 할 칼럼은 바로 numeric(20, 5) 데이터 타입으로 저장한 numeric_column입니다.

precision을 20을, scale을 5로 설정해줬는데 1행(row)의 데이터를 보면 0.7을 저장했음에도 최대 저장할 수 있는 남은 소수점 자리를 알아서 0으로 채워줬습니다. 이렇게 프로그램에서 알아서 빈 공간을 채워주는 걸 padding이라고 합니다.

반면 3행의 경우 최대로 표현할 수 있는 소수점이 5자리이기 때문에 소수점 6자리부터는 반올림을 해서 데이터를 저장한 걸 볼 수 있습니다.

 

Real, Double

Real과 Double 타입은 모두 부동소수점 데이터 타입입니다. 여기서 부동은 '움직일 수 없다(不)'의 부동이 아니라, 우리나라 말 중에 물 위를 부유하다'의 부(浮). 마치 '물위를 둥둥 떠다니는 것처럼 유동적으로 소수점의 길이를 조절한다'라는 의미의 부동입니다. C언어를 공부한 분이라면 float 자료형을 알고 계실 텐데 바로 그 float이 SQL에서의 real과 double입니다.

real은 최대 6자리까지 소수점을 소수점을 표현할 수 있고, double은 이름에 걸맞게 real보다 2배가 조금 넘은 총 15자리의 소수점을 표현할 수 있습니다.

real과 double 모두 자신이 입력받은 숫자만큼의 소수점을 표현하고, numeric처럼 빈 공간의 padding을 해주지 않습니다.

 

그렇다면, numeric에 비해 일일이 precision과 scale을 관리할 필요도 없는 real이나 double을 사용하는 게 무조건 알맞을까요? 하면 무조건 그렇지만은 않습니다. 그 이유를 다음의 결과를 통해 설명하겠습니다.

왼쪽의 쿼리를 통해 오른쪽의 결과를 추출했습니다.

numeric 타입의 데이터는 보이는 것처럼 원래 저장한 0.7에 1000000을 곱한 값을 출력해줬습니다.

그런데 double 타입의 데이터는 정확히 7000000.00000이 아니라 7에 근사한 6.9999... 라는 숫자를 출력합니다.

이건 부동소수점 데이터타입이 컴퓨터 내부적으로 이런 결과를 출력하도록 하는 이유 때문이라고 하는데 정확한 이유에 대한 설명은 저도 잘 이해를 하지 못해서 생략하겠습니다.

그럼에도 전달하고자하는 점은, real과 double 타입 모두 아주 섬세하고 정확하게 다뤄야 하는 데이터의 경우에는 오류를 발생시킬 수 있다는 점입니다.

예를 들어 한 나라의 한 해 예산이나, 우주로 우주선을 쏘아올리는 연산에서는 아주 작은 오차도 큰 문제로 폭발할 수 있는데 그런 경우에는 real이나 double 타입의 사용은 그렇지 바람직하지 않은 것 같습니다.

'Information Technology > DB' 카테고리의 다른 글

[PostgreSQL] 외부 데이터 COPY  (0) 2020.04.18
[MySQL] MySQL 기초  (0) 2020.03.12