What is the default Precision and Scale for a Number in Oracle?

oracle number (precision (, scale))
oracle number datatype limit
number(38 0) in oracle
number(*,0 in oracle)
oracle precision
how to get decimal value in oracle
oracle integer vs number
oracle integer data type

When creating a column of type NUMBER in Oracle, you have the option of not specifying a precision or scale. What do these default do if you don't specify them?

NUMBER (precision, scale)

If a precision is not specified, the column stores values as given. If no scale is specified, the scale is zero.

A lot more info at:

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

What is the default Precision and Scale for a Number in Oracle , column_name NUMBER (precision, scale). If a precision is not specified, the column stores values as given. If no scale is specified  The Oracle NUMBER data type has precision and scale. The precision is the number of digits in a number. It ranges from 1 to 38. The scale is the number of digits to the right of the decimal point in a number. It ranges from -84 to 127. For example, the number 1234.56 has a precision of 6 and a scale of 2. So to store this number, you need NUMBER(6,2). Both precision and scale are in decimal digits and optional.

The NUMBER type can be specified in different styles:

                Resulting  Resulting  Precision
Specification   Precision  Scale      Check      Comment
―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
NUMBER          NULL       NULL       NO         'maximum range and precision',
                                                 values are stored 'as given'
NUMBER(P, S)    P          S          YES        Error code: ORA-01438
NUMBER(P)       P          0          YES        Error code: ORA-01438
NUMBER(*, S)    38         S          NO

Where the precision is the total number of digits and scale is the number of digits right or left (negative scale) of the decimal point.

Oracle specifies ORA-01438 as

value larger than specified precision allowed for this column

As noted in the table, this integrity check is only active if the precision is explicitly specified. Otherwise Oracle silently rounds the inserted or updated value using some unspecified method.

Vincent VAUBAN's Blog: Default precision and sc, The numeric data types described in Table 2-2, "OLAP DML Numeric Data When you define a NUMBER variable, you can specify its precision (p) and scale (s) The NUMBER data type is supported by Oracle Database standard libraries​  As we can see, the maximal number here is 7.(7) * 10^124, and he have 19centesimal digits for precision, or 38decimal digits. When creating a column of type NUMBER in Oracle, you have the option of not specifying a precision or scale. What do these default do if you don't specify them? Actually, you can always test it by yourself.

I believe the default precision is 38, default scale is zero. However the actual size of an instance of this column, is dynamic. It will take as much space as needed to store the value, or max 21 bytes.

Numeric Data Types, The precision is the number of digits in a number. It ranges from 1 to 38. The scale is the number of digits to the right of the decimal point in a number. It ranges  Oracle guarantees the portability of numbers with precision ranging from 1 to 38. Scale is the number of digits to the right (positive) or left (negative) of the decimal point. The scale can range from -84 to 127. In your case, ID with precision 6 means it won't accept a number with 7 or more significant digits.

Oracle stores numbers in the following way: 1 byte for power, 1 byte for the first significand digit (that is one before the separator), the rest for the other digits.

By digits here Oracle means 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

As we can see, the maximal number here is 7.(7) * 10^124, and he have 19 centesimal digits for precision, or 38 decimal digits.

Oracle NUMBER Data Type By Practical Examples, 32767 bytes. Default and minimum size is 1 byte. NUMBER(p,s). Number having precision p and scale s. The precision p can range from 1 to. 38. The scale. A column with the NUMBER datatype can be defined as follows: column_name NUMBER (precision, scale) The precision defines the total number of digits. The scale defines the number of digits to the right of the decimal point. If you specify a negative scale, Oracle Database rounds the actual data to the specified number of places to the left of the decimal point. For example, specifying (7,-2) means Oracle Database rounds to the nearest hundredths .

Actually, you can always test it by yourself.

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';

[PDF] Oracle Datatypes, NUMBER is a data type used to store numeric values. Syntax: NUMBER[(​precision [, scale])]. Number having precision p and scale s. NUMBER Type Syntax and Usage The syntax for the NUMBER type is straightforward: NUMBER( p,s ) where P and S are optional and are used to specify the following: * Precision, or the total number of digits. By default, the precision is 38 and has valid values in the range of 1 to 38. The character * may be used to represent 38 as well.

Number, When creating a column of type NUMBER in Oracle, you have the option of not specifying a precision or scale. What do these default do if you don't specify them​? Precision is the number of digits in a number. Scale is the number of digits to the right of the decimal point in a number. For example, the number 123.45 has a precision of 5 and a scale of 2. In SQL Server, the default maximum precision of numeric and decimal data types is 38. In earlier versions of SQL Server, the default maximum is 28.

What is the default Precision and Scale for a Number in Oracle?, The default precision is 38. s is the scale which is the number of decimal digits that will be stored to the right of the decimal point. The scale has a range from  column_name NUMBER (precision, scale) If a precision is not specified, the column stores values as given. If no scale is specified, the scale is zero. Oracle guarantees portability of numbers with a precision equal to or less than 38 digits. You can specify a scale and no precision: column_name NUMBER (*, scale) In this case, the precision is 38, and the specified scale is maintained.

An Essential Guide To SQL Server DECIMAL Data Type, Where p is the precision and s is the scale. For example, numeric(7,2) is a number that has 5 digits before the decimal and 2 digits after the decimal. The NUMERIC and DECIMAL datatypes can specify only fixed-point numbers. For those datatypes, the scale (s) defaults to 0. The FLOAT datatype is a floating-point number with a binary precision b. The default precision for this datatype is 126 binary, or 38 decimal. The DOUBLE PRECISION datatype is a floating-point number with binary precision 126.

Comments
  • Float is very different from number type which is discrete. So, I would think it is not going to use float
  • I know it's straight from the docs, but IMO the second sentence should read, "If precision is specified but scale is not, the scale is zero." Otherwise both apply to number: "no scale is specified," meaning "the scale is zero" (only integers allowed), and "a precision is not specified," meaning values are stored "as given" (floating points allowed). "As given" is the one that's actually true for number, but not for lack of overlap. Fortunately they clarified for 12c.
  • I know the question in not about SSIS but a search brought me here. If I reference a NUMBER column without precision or scale in SSIS, it calls it a float (DT_R8). So from my perspective, @qualidafial is correct
  • That untrue sentence in the documentation is exactly why people search for this. That sentence states that NUMBER means NUMBER(38, 0), which is not true, and contradicts the example shown later.
  • I vote for this answer. If you define the column as NUMBER only, you will have maximum precision and maximum scale. If you define the column as NUMBER(5), the precision is 5, the scale is 0.
  • What does * mean as precision in NUMBER? What if I define a NUMBER(*,0) and try to insert 123456789123456789123456789123456789123456789 (i.e 45 digits)? What will be stored? and why? What is the mathematics?
  • @Nawaz, * just means that Oracle uses its default, i.e. 38. That means that NUMBER(*, 0) is equivalent to NUMBER(38, 0). If you try to insert a number with 45 decimal digits into a NUMBER(38,0) column you get an error.
  • @maxschlepzig: But if I insert a 45 digits number int a NUMBER(*,0), then it succeeds without any warning, though with some rounding. So, that means NUMBER(38,0) and NUMBER(*,0) are not same. INT/INTEGER/SMALLINT seems to behave in the same was as NUMBER(*,0) though.
  • @Nawaz, then the Oracle Number semantics are even more complicated - with the asterisk you get 38 digits of precision ('the precision is 38'), but it seems you get integrity checking only when both parameters are explicitly specified: 'When you specify numeric fields, it is a good idea to specify the precision and scale. This provides extra integrity checking on input.' - Oracle doesn't specify how it rounds after the 38 digits - probably also platform dependent. I'll update the table next week.
  • This answer is not correct. You can easily give a counter example: create table ex(n number); insert into ex(n) values(1.5); select * from ex; You get back 1.5. With scale=0 you would get back 1. This is also documented, e.g. with 11.2 Oracle documents that just NUMBER (without precision and without scale) results in 'maximum range and precision'.
  • This unfortunately doesn't reveal the default precision and scale of NUMBER, it just returns NULL CUSTOMER_ID DATA_TYPE:NUMBER NULLABLE:N DATA_LENGTH:22 DATA_PRECISION:(null) DATA_SCALE:(null)
  • However if you test by inserting very large numbers, all will be revealed: CREATE TABLE TEST_NUMBER (N1 NUMBER); INSERT INTO TEST_NUMBER (N1) VALUES (98765432109876543210987654321098765432109876543210.01234567890123456789); SELECT N1 FROM TEST_NUMBER; yields: 98765432109876543210987654321098765432110000000000