숫자 데이터 타입
오라클에서 제공하는 숫자형 테이터는 다음과 같다.
데이터 타입 | 설명 |
---|---|
NUMBER [(p, [s])] | 가변숫자, p(1~38, 디폴트 값은 38)와 s(-84~127, 디폴트 값은 0)는 십진수 기준, 최대 22byte |
FLOAT[(p)] | NUMBER의 하위 타입, p는 1~128, 디폴트 값은 128, 이진수 기준, 최대 22byte |
BINARY_FLOAT | 32비트 부동소수점 수, 최대 4byte |
BINARY_DOUBLE | 64비트 부동소수점 수, 최대 8byte |
숫자 타입은 총 4가지가 있긴 하지만 NUMBER형만 사용할 때가 많다. 다른 DBMS는 INTEGER와 같은 정수형, DECIMAL과 같은 실수형을 제공한다. 오라클도 이런 타입으로 컬럼을 생성할 수 있지만 내부적으로는 모두 NUMBER형으로 변환되어 생성된다.
입력
CREATE TABLE ex2_3 (
COL_INT INTEGER,
COL_DEC DECIMAL,
COL_NUM NUMBER
);
결과
table EX2_3이(가) 생성되었습니다.
생성된 테이블 컬럼의 타입과 길이는 user_tab_cols라는 시스템 뷰를 조회하면 알 수 있다.
입력
SELECT column_id, column_name, data_type, data_length
FROM user_tab_cols
WHERE table_name = 'EX2_3'
ORDER BY column_id;
결과
COLUMN_ID COLUMN_NAME DATA_TYPE DATA_LENGTH
--------- ----------- --------- -----------
1 COL_INT NUMBER 22
2 COL_DEC NUMBER 22
3 COL_NUM NUMBER 22
모두 NUMBER형으로 생성됐고 길이는 22byte임을 알 수 있다. NUMBER형은 크기를 명시하지 않거나 ‘*’를 명시하면, 즉 “컬럼명 NUMER” 혹은 “컬럼명 NUMBER(*)”를 명시하면 디폴트 값인 38이 적용되어 최대 크기인 22byte를 차지하는 것이다. 그리고 NUMBER (p, s) 형식으로 크기를 지정할 수도 있는데, p(precision, 정밀도)는 최대 유효숫자 자릿수를 s(scale)는 소수점 기준 자릿수를 의미한다. 이 내용을 정리하면 다음과 같다.
❶ p는 소수점 기준 모든 유효숫자 자릿수를 의미한다. 만약 p에 명시한 것보다 큰 숫자값을 입력하면 오류가 발생한다.
❷ s가 양수면 소수점 이하, 음수이면 소수점 이상(소수점 기준 왼쪽) 유효숫자 자릿수를 나타낸다.
❸ s에 명시한 숫자 이상의 숫자를 입력하면, s에 명시한 숫자로 반올림 처리한다.
❹ s가 음수이면 소수점 기준 왼쪽 자릿수만큼 반올림한다.
❺ s가 p보다 크면 p는 소수점 이하 유효숫자 자릿수를 의미한다.
다양한 값에 따란 NUMBER형의 정의와 그 결과를 표로 나타내면 다음과 같다.
숫자 값 | 타입 | 결과 | 설명 |
---|---|---|---|
123.54 | NUMBER | 123.54 | 정상 |
123.54 | NUMBER(3) | 124 | s는 명시하지 않아 0, p가 3이므로 소수점 첫 자리에서 반올림됨 |
123.54 | NUMBER(3, 2) | 오류 | p가 3인데 입력값인 123.54는 유효숫자가 다섯 자리여서 오류. 유효숫자가 p보다 크면 오류 발생 |
123.54 | NUMBER(5, 2) | 123.54 | 정상 |
123.54 | NUMBER(7, 1) | 123.5 | s가 1이므로 .54가 반올림되어 .5 |
123.54 | NUMBER(7, -1) | 120 | s가 -1이어서 소수점 왼쪽 첫 자리 3이 반올림되어 120 |
125.54 | NUMBER(7, -1) | 130 | s가 -1이어서 소수점 왼쪽 첫 자리 5가 반올림되어 130 |
0.1234 | NUMBER(4,5) | 오류 | 유효숫자는 4개 맞지만 s가 5인데 네 자리수이므로 오류 발생 |
0.01234 | NUMBER(4,5) | 0.01234 | 소수점 이하 다섯째까지 유효숫자 4개, 정상 |
0.0001234 | NUMBER(4,7) | 0.0001234 | 소수점 이하 일곱 째 자리까지 유효숫자 4개, 정상 |
0.0001234 | NUMBER(3,7) | 오류 | 소수점 이하 일곱 째 자리까지 유효숫자는 1234, 4개인데 p가 3이므로 오류 발생 |
0.0000123 | NUMBER(3,7) | 0.0000123 | 소수점 이하 일곱 째 자리까지 유효숫자는 123, 3개이고 p가 3이므로 정상 |
0.00001234 | NUMBER(3,7) | 0.0000123 | 소수점 이하 일곱 째 자리까지 유효숫자는 123, 4는 제외됨 |
나머지 FLOAT형, BINARY_FLOAT형, BINARY_DOUBLE형은 NUMBER보다 그 범위가 제한된 타입이다. FLOAT은 scale을, BINARY_FLOAT과 BINARY_DOUBLE은 precision과 scale 모두 지정할 수 없다. 다만 NUMBER로 설정하기에는 실제 입력되는 값의 크기가 훨씬 작을 때는 보다 적절한 타입을 골라 사용하면 저장 공간을 절약할 수 있다.
정리하자면 숫자형 데이터는 “오라클에서는 NUMBER형만 사용해도 되며, 그 크기 설정에 있어 p와 s를 적절히 조정하면 된다.” 라고 알아두면 되겠다.