有一列具有数据类型编号、数据长度22、数据精度5、数据刻度1。这意味着它可以容纳最大值为9999.9要求是-我必须使此列容纳最大值为9999.99,即数据精度6和数据刻度2。我想知道这里数据长度的意义是什么?我必须改变它的精度和比例,或者它可以容纳9999.99而不做任何改变,因为长度已经是22
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个小数。希望能澄清一下
jtoj6r0c2#
因为列的数据长度是(22,5),所以它也可以容纳(6,2)。如果您仍然希望将数据长度限制为(6,2)以满足任何技术/业务需求,可以使用下面的alter语句来修改您的列。
alter table table_name modify column_name number(6, 2);
2条答案
按热度按时间9avjhtql1#
考虑到oracle的定义:
data\u length是列的长度(以字节为单位)。data\ u precision是number数据类型的十进制精度,float数据类型的二进制精度,所有其他数据类型的null。数据刻度是数字小数点右边的数字
举个例子:
如您所见,数据长度总是22。这是因为数字是以数据包的形式存储的,所以字典将始终显示22,但我可以插入一个大于22位的数字。
但是,在您的示例中,您说的是数据精度5和数据比例1,因此让我们截断表并修改列:
总而言之,使用数据刻度5和数据精度1,您可以存储任何类型的数字,最高可达此最大精度+刻度。所以我可以存储9999.9和99(比例和精度是建议性的),但我不能存储9999.99,因为我的比例是1,这里的数字有2个小数。
希望能澄清一下
jtoj6r0c2#
因为列的数据长度是(22,5),所以它也可以容纳(6,2)。如果您仍然希望将数据长度限制为(6,2)以满足任何技术/业务需求,可以使用下面的alter语句来修改您的列。