Oracle의 숫자의 기본 정밀도와 스케일은 얼마입니까?
-
09-09-2019 - |
문제
Oracle에서 유형 번호 열을 만들 때 정밀 또는 스케일을 지정하지 않는 옵션이 있습니다. 이 기본값은 지정하지 않으면 어떻게합니까?
해결책
숫자 (정밀, 스케일)
정밀도가 지정되지 않은 경우 열은 주어진대로 값을 저장합니다. 스케일이 지정되지 않으면 스케일은 0입니다.
더 많은 정보 :
http://download.oracle.com/docs/cd/b28359_01/server.111/b28318/datatype.htm#cncpt1832
다른 팁
그만큼 NUMBER
유형을 지정할 수 있습니다 다른 스타일:
Resulting Resulting Precision Specification Precision Scale Check Comment ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― NUMBER NULL NULL NO '최대 범위 and 정도', values are stored '주어진' NUMBER(P, S) P S YES Error code: ORA-01438 NUMBER(P) P 0 YES Error code: ORA-01438 NUMBER(*, S) 38 S NO
여기서 정밀도는 총 숫자 수와 스케일이 소수점의 오른쪽 또는 왼쪽 (음의 스케일) 수입니다.
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 릴리스 11.2.0.2.0- 프로덕션에서 수행되었습니다.
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