program tip

Oracle에서 숫자에 대한 기본 정밀도 및 스케일은 무엇입니까?

radiobox 2020. 12. 5. 09:33
반응형

Oracle에서 숫자에 대한 기본 정밀도 및 스케일은 무엇입니까?


Oracle에서 NUMBER 유형의 열을 작성할 때 정밀도 또는 스케일을 지정하지 않는 옵션이 있습니다. 이러한 기본값을 지정하지 않으면 어떻게됩니까?


NUMBER (정밀도, 척도)

정밀도가 지정되지 않은 경우 열은 주어진 값을 저장합니다. 스케일이 지정되지 않은 경우 스케일은 0입니다.

더 많은 정보 :

http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832


NUMBER유형을 지정할 수 있습니다 다른 스타일 :

                결과 결과 정밀도
사양 정밀 스케일 확인 설명
――――――――――――――――――――――――――――――――――――――――――――――――― ――――――――――――――――――――――――――――
NUMBER NULL NULL NO          '최대 범위정밀도' ,
                                                 값은 '주어진대로' 저장됩니다.
NUMBER (P, S) PS 예 오류 코드 : ORA-01438
NUMBER (P) P 0 예 오류 코드 : ORA-01438
NUMBER (*, S) 38 S 아니오

정밀도는 총 자릿수이고 스케일은 소수점의 오른쪽 또는 왼쪽 (음수 스케일) 자릿수입니다.

Oracle은 ORA-01438을 다음과 같이 지정합니다.

이 열에 허용 된 지정된 정밀도보다 큰 값

표에 설명 된대로이 무결성 검사는 정밀도가 명시 적으로 지정된 경우에만 활성화됩니다. 그렇지 않으면 Oracle은 지정되지 않은 방법을 사용하여 삽입되거나 업데이트 된 값을 자동으로 반올림합니다.


기본 정밀도는 38이고 기본 배율은 0입니다. 그러나이 열 인스턴스의 실제 크기는 동적입니다. 값을 저장하는 데 필요한만큼의 공간 또는 최대 21 바이트가 필요합니다.


Oracle다음과 같은 방식으로 숫자를 저장합니다. 1 byte거듭 제곱의 1 byte경우 첫 번째 유효 숫자 (구분자 앞의 하나), 나머지는 다른 숫자에 대해 저장합니다.

으로 digits여기 Oracle수단 centesimal digits(예 base 100)

SQL> INSERT INTO t_numtest VALUES (LPAD('9', 125, '9'))
  2  /

1 row inserted

SQL> INSERT INTO t_numtest VALUES (LPAD('7', 125, '7'))
  2  /

1 row inserted

SQL> INSERT INTO t_numtest VALUES (LPAD('9', 126, '9'))
  2  /

INSERT INTO t_numtest VALUES (LPAD('9', 126, '9'))

ORA-01426: numeric overflow

SQL> SELECT DUMP(num) FROM t_numtest;

DUMP(NUM)
--------------------------------------------------------------------------------
Typ=2 Len=2: 255,11
Typ=2 Len=21: 255,8,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79

보시다시피, 여기에서 최대 수는 7.(7) * 10^124이고, 그는 19정밀도에 대한 센티 38멀 자릿수 또는 십진수를 가지고 있습니다.


실제로 언제든지 직접 테스트 할 수 있습니다.

CREATE TABLE CUSTOMERS ( CUSTOMER_ID NUMBER NOT NULL, JOIN_DATE DATE NOT NULL, CUSTOMER_STATUS VARCHAR2(8) NOT NULL, CUSTOMER_NAME VARCHAR2(20) NOT NULL, CREDITRATING VARCHAR2(10) ) ;

select column_name, data_type, nullable, data_length, data_precision, data_scale from user_tab_columns where table_name ='CUSTOMERS';


사람들이 스스로 시도 할 필요가 없도록 스펙트럼의 답변을 확장합니다.

이것은 Oracle Database 11g Express Edition Release 11.2.0.2.0-Production에서 수행되었습니다.

CREATE TABLE CUSTOMERS
(
  CUSTOMER_ID NUMBER NOT NULL,
  FOO FLOAT NOT NULL,
  JOIN_DATE DATE NOT NULL,
  CUSTOMER_STATUS VARCHAR2(8) NOT NULL,
  CUSTOMER_NAME VARCHAR2(20) NOT NULL,
  CREDITRATING VARCHAR2(10)
);

select column_name, data_type, nullable, data_length, data_precision, data_scale
from user_tab_columns where table_name ='CUSTOMERS'; 

어느 양보

COLUMN_NAME      DATA_TYPE  NULLABLE DATA_LENGTH DATA_PRECISION DATA_SCALE
CUSTOMER_ID      NUMBER     N        22        
FOO              FLOAT      N        22          126    
JOIN_DATE        DATE       N        7        
CUSTOMER_STATUS  VARCHAR2   N        8        
CUSTOMER_NAME    VARCHAR2   N        20        
CREDITRATING     VARCHAR2   Y        10    

참고URL : https://stackoverflow.com/questions/593197/what-is-the-default-precision-and-scale-for-a-number-in-oracle

반응형