더북(TheBook)

숫자 데이터 타입

오라클에서 제공하는 숫자형 테이터는 다음과 같다.

표 2-3 숫자 데이터 타입
데이터 타입 설명
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형의 정의와 그 결과를 표로 나타내면 다음과 같다.

표 2-4 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를 적절히 조정하면 된다.” 라고 알아두면 되겠다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.