考虑到 Oracle 的定义:
DATA_LENGTH 是列的长度(以字节为单位)。 DATA_PRECISION 是 NUMBER 数据类型的十进制精度,FLOAT 数据类型的二进制精度,所有其他数据类型的 null。 DATA_SCALE是数字中小数点右边的数字
举个例子:
SQL> create table check_size ( c1 number, c2 number(6) , c3 number(6,3) );
Table created.
SQL> set lines 200
SQL> r
1 SELECT COLUMN_NAME,
2 DATA_TYPE,
3 DATA_LENGTH,
4 DATA_PRECISION,
5 DATA_SCALE
6 FROM ALL_TAB_COLS
7 WHERE OWNER='TEST'
8* AND TABLE_NAME = 'CHECK_SIZE'
COLUMN_NAME DATA_TYPE DATA_LENGTH DATA_PRECISION DATA_SCALE
------------------------------ ------------------------------ ----------- -------------- ----------
C1 NUMBER 22
C2 NUMBER 22 6 0
C3 NUMBER 22 6 3
如您所见,data_length 始终为 22。那是因为数字是作为数据包存储的,所以字典会始终显示 22,但我可以插入大于 22 位的数字。
SQL> insert into check_size values ( 99999999999999999999999999999999999999999999 , 999999, 999.99 );
1 row created.
SQL> select dump(c1) as content from check_size ;
CONTENT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Typ=2 Len=2: 215,2
但是,在您的情况下,您说的是数据精度 5 和数据规模 1,所以让我们截断表并修改列:
SQL> truncate table check_size ;
Table truncated.
SQL> alter table check_size modify c3 number ( 5,1 );
Table altered.
SQL> insert into check_size values ( 99999999999999999999999999999999999999999999 , 999999, 99 );
1 row created.
SQL> insert into check_size values ( 99999999999999999999999999999999999999999999 , 999999, 9999.9 );
1 row created.
SQL> insert into check_size values ( 99999999999999999999999999999999999999999999 , 999999, 9999.99 );
insert into check_size values ( 99999999999999999999999999999999999999999999 , 999999, 9999.99 )
*
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column
总结一下,使用数据比例 5 和数据精度 1,您可以存储任何类型的数字,直到最大精度 + 比例。所以我可以存储 9999.9 和 99(比例和精度是建议性的),但我不能 9999.99,因为我的比例是 1,这里的数字有 2 个小数。
希望它澄清
问候