sql—数据长度与数据精度之比

hjqgdpho  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(415)

有一列具有数据类型编号、数据长度22、数据精度5、数据刻度1。这意味着它可以容纳最大值为9999.9要求是-我必须使此列容纳最大值为9999.99,即数据精度6和数据刻度2。我想知道这里数据长度的意义是什么?我必须改变它的精度和比例,或者它可以容纳9999.99而不做任何改变,因为长度已经是22

9avjhtql

9avjhtql1#

考虑到oracle的定义:
data\u length是列的长度(以字节为单位)。data\ u precision是number数据类型的十进制精度,float数据类型的二进制精度,所有其他数据类型的null。数据刻度是数字小数点右边的数字
举个例子:

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

如您所见,数据长度总是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个小数。
希望能澄清一下

jtoj6r0c

jtoj6r0c2#

因为列的数据长度是(22,5),所以它也可以容纳(6,2)。如果您仍然希望将数据长度限制为(6,2)以满足任何技术/业务需求,可以使用下面的alter语句来修改您的列。

alter table table_name modify column_name number(6, 2);

相关问题