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?
73
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?
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 zutrifftnumber
, 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 richtigNUMBER
MittelNUMBER(38, 0)
, die nicht wahr ist, und widerspricht dem Beispiel später gezeigt.Der
NUMBER
Typ kann in verschiedenen Stilen angegeben werden :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
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.
quelle
*
bedeutet Präzision inNUMBER
? Was ist, wenn ich definierea NUMBER(*,0)
und versuche einzufügen123456789123456789123456789123456789123456789
(dh 45 Ziffern)? Was wird gespeichert? und warum? Was ist die Mathematik?*
bedeutet nur, dass Oracle seine Standardeinstellung verwendet, dh 38. Das bedeutet, dass diesNUMBER(*, 0)
äquivalent zu istNUMBER(38, 0)
. Wenn Sie versuchen, eine Zahl mit 45 Dezimalstellen in eineNUMBER(38,0)
Spalte einzufügen , wird eine Fehlermeldung angezeigt.NUMBER(*,0)
, gelingt dies ohne Vorwarnung, allerdings mit einigen Rundungen. Das bedeutetNUMBER(38,0)
undNUMBER(*,0)
ist nicht dasselbe.INT/INTEGER/SMALLINT
scheint sich so zu verhalten, alsNUMBER(*,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.
quelle
create table ex(n number); insert into ex(n) values(1.5); select * from ex;
Sie kommen zurück1.5
. Mitscale=0
würden Sie zurückkommen1
. Dies wird auch dokumentiert, z. B. mit 11.2 Oracle-Dokumenten, die nurNUMBER
(ohne Genauigkeit und ohne Skalierung) zu "maximaler Reichweite und Genauigkeit" führen.Oracle
speichert Zahlen auf folgende Weise:1 byte
für die Potenz1 byte
für die erste signifikante Ziffer (dh eine vor dem Trennzeichen), den Rest für die anderen Ziffern.Mit
digits
hierOracle
bedeutetcentesimal digits
(dhbase 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 hat19
Centesimalstellen für die Genauigkeit oder38
Dezimalstellen.quelle
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';
quelle
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
quelle