Beim Erstellen einer Spalte vom Typ NUMBER in Oracle haben Sie die Möglichkeit, keine Genauigkeit oder Skalierung anzugeben. Was machen diese Standardeinstellungen, wenn Sie sie nicht angeben?
Antworten:
NUMMER (Präzision, Skalierung)
Wenn keine Genauigkeit angegeben wird, werden in der Spalte die angegebenen Werte gespeichert. Wenn keine Skala angegeben ist, ist die Skala Null.
Viel mehr Infos unter:
http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832
number
: "Es wird keine Skalierung angegeben", was bedeutet, dass "die Skalierung Null ist" (nur Ganzzahlen sind zulässig) und "Eine Genauigkeit ist nicht angegeben", was bedeutet, dass Werte "wie angegeben" gespeichert werden (Gleitkommazahlen zulässig). "Wie gegeben" ist das, was tatsächlich zutrifft number
, aber nicht aus Mangel an Überlappung. Zum Glück haben sie für 12c geklärt.
NUMBER
in SSIS auf eine Spalte ohne Genauigkeit oder Skalierung verweise, wird sie als float (DT_R8) bezeichnet. Also aus meiner Sicht ist @qualidafial richtig
NUMBER
Mittel NUMBER(38, 0)
, die nicht wahr ist, und widerspricht dem Beispiel später gezeigt.
Der NUMBER
Typ kann in verschiedenen Stilen angegeben werden :
Resultierende resultierende Präzision Spezifikation Präzisionsskalenprüfung Kommentar - ―――――――――――――――――――――――――――――――― NUMBER NULL NULL NO 'maximale Reichweite und Präzision' , Werte werden 'wie angegeben' gespeichert NUMMER (P, S) PS JA Fehlercode: ORA-01438 NUMMER (P) P 0 JA Fehlercode: ORA-01438 NUMMER (*, S) 38 S NR
Dabei ist die Genauigkeit die Gesamtzahl der Stellen und die Skalierung die Anzahl der Stellen rechts oder links (negative Skala) des Dezimalpunkts.
Oracle gibt ORA-01438 als an
Wert größer als die angegebene Genauigkeit, die für diese Spalte zulässig ist
Wie in der Tabelle angegeben, ist diese Integritätsprüfung nur aktiv, wenn die Genauigkeit explizit angegeben ist. Andernfalls rundet Oracle den eingefügten oder aktualisierten Wert stillschweigend mit einer nicht angegebenen Methode.
*
bedeutet Präzision in NUMBER
? Was ist, wenn ich definiere a NUMBER(*,0)
und versuche einzufügen 123456789123456789123456789123456789123456789
(dh 45 Ziffern)? Was wird gespeichert? und warum? Was ist die Mathematik?
*
bedeutet nur, dass Oracle seine Standardeinstellung verwendet, dh 38. Das bedeutet, dass dies NUMBER(*, 0)
äquivalent zu ist NUMBER(38, 0)
. Wenn Sie versuchen, eine Zahl mit 45 Dezimalstellen in eine NUMBER(38,0)
Spalte einzufügen , wird eine Fehlermeldung angezeigt.
NUMBER(*,0)
, gelingt dies ohne Vorwarnung, allerdings mit einigen Rundungen. Das bedeutet NUMBER(38,0)
und NUMBER(*,0)
ist nicht dasselbe. INT/INTEGER/SMALLINT
scheint sich so zu verhalten, als NUMBER(*,0)
ob.
Ich glaube, die Standardgenauigkeit ist 38, die Standardskala ist Null. Die tatsächliche Größe einer Instanz dieser Spalte ist jedoch dynamisch. Es wird so viel Speicherplatz benötigt, wie zum Speichern des Werts erforderlich ist, oder maximal 21 Byte.
create table ex(n number); insert into ex(n) values(1.5); select * from ex;
Sie kommen zurück 1.5
. Mit scale=0
würden Sie zurückkommen 1
. Dies wird auch dokumentiert, z. B. mit 11.2 Oracle-Dokumenten, die nur NUMBER
(ohne Genauigkeit und ohne Skalierung) zu "maximaler Reichweite und Genauigkeit" führen.
Oracle
speichert Zahlen auf folgende Weise: 1 byte
für die Potenz 1 byte
für die erste signifikante Ziffer (dh eine vor dem Trennzeichen), den Rest für die anderen Ziffern.
Mit digits
hier Oracle
bedeutet centesimal digits
(dh 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
Wie wir sehen können, ist die maximale Anzahl hier 7.(7) * 10^124
und er hat 19
Centesimalstellen für die Genauigkeit oder 38
Dezimalstellen.
Eigentlich können Sie es immer selbst testen.
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';
Ich erweitere die Antwort von spectra, damit die Leute es nicht selbst ausprobieren müssen.
Dies wurde in Oracle Database 11g Express Edition Version 11.2.0.2.0 - Produktion durchgeführt.
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';
Welche ergibt
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