Lors de la création d'une colonne de type NUMBER dans Oracle, vous avez la possibilité de ne pas spécifier de précision ou d'échelle. Que font ces valeurs par défaut si vous ne les spécifiez pas?
NOMBRE (précision, échelle)
Si aucune précision n'est spécifiée, la colonne stocke les valeurs telles qu'elles sont données. Si aucune échelle n'est spécifiée, l'échelle est zéro.
Beaucoup plus d'infos sur:
http://download.Oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832
Le type NUMBER
peut être spécifié dans styles différents :
Précision résultante résultante Spécification Vérification de l'échelle de précision Commentaire -------------------------------------------------- ―― NUMBER NULL NULL NO 'plage maximale et précision' , Valeurs sont stockées 'comme indiqué' = NUMÉRO (P, S) PS OUI Code d'erreur: ORA-01438 NUMÉRO (P) P 0 OUI Code d'erreur: ORA-01438 NUMÉRO (*, S) 38 S NON
Où précision correspond au nombre total de chiffres et échelle à nombre de chiffres à droite ou à gauche (échelle négative) de la virgule décimale.
Oracle spécifie ORA-01438 comme
valeur supérieure à la précision spécifiée autorisée pour cette colonne
Comme indiqué dans le tableau, cette vérification d'intégrité n'est active que si la précision est explicitement spécifiée. Sinon, Oracle arrondit silencieusement la valeur insérée ou mise à jour en utilisant une méthode non spécifiée.
Je crois que la précision par défaut est 38, l'échelle par défaut est zéro. Cependant, la taille réelle d'une instance de cette colonne est dynamique. Il faudra autant d’espace que nécessaire pour stocker la valeur, soit 21 octets maximum.
Oracle
enregistre les nombres de la manière suivante: 1 byte
pour l'alimentation, 1 byte
pour le premier chiffre significatif (c'est-à-dire avant le séparateur), le reste pour les autres chiffres.
Par digits
ici Oracle
signifie centesimal digits
(I. E. 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
Comme nous pouvons le constater, le nombre maximal ici est 7.(7) * 10^124
, et il a 19
Chiffres centésimaux de précision, ou 38
Chiffres décimaux.
En fait, vous pouvez toujours le tester vous-même.
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';
Je développe la réponse de spectra afin que les gens n’aient pas à l’essayer eux-mêmes.
Cette opération a été effectuée sur Oracle Database 11g Express Edition, version 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';
Quels rendements
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