Oracle Number 数据类型及其严格性
Posted
技术标签:
【中文标题】Oracle Number 数据类型及其严格性【英文标题】:Oracle Number data type and its strictness 【发布时间】:2012-04-21 12:22:07 【问题描述】:我对 oracle 很陌生,但我一直在课堂上学习它,最近我遇到了 number
数据类型。我已经阅读了有关比例和精度 (s,p) 的文档,但我仍然对该类型的正确使用不持肯定态度。
假设我想将百分比值存储为小数。小数点可以是 0 到 1 之间的任意值,小数点后最多可以有 3 个数字。
一些可能要存储的小数可能包括:
.66
.553
1.00
如果我要创建NUMBER(4,3)
列,即使只有两个数字,这也行吗?见下文
.22
.10
.35
etc...
简而言之,数字类型是否要求满足 EXACT 大小?例如。 NUMBER(4,3) 是否绝对要求插入的数据是 4 个数字,其中 3 个在小数点后?
感谢您的帮助!
【问题讨论】:
Anumber(4, 3)
可以保存从 -9.999 到 9.999 的值(含)。为了将数字保持在您想要的有效范围内,除了将其声明为number(4,3)
类型之外,还需要一个检查约束。 create table t (n number(4,3) constraint t_c0 check (t between 0 and 1))
【参考方案1】:
列的数据类型限制了可以存储的值的范围。但他们不会做任何事情来强制特定的长度或精度。
就像您可以在 VARCHAR2(100)
列中存储单个字符或 NULL 一样,您可以存储小于 3 位精度和小于 4 位小数位数的数字。例如,值 0 和 6.1 对于 NUMBER(4,3)
列都是完全有效的。如果您插入的值的精度位数过多,则该值将被静默四舍五入到列定义中指定的精度。
SQL> create table foo (
2 col1 number(4,3)
3 );
Table created.
SQL> insert into foo values( 9.999 );
1 row created.
SQL> insert into foo values (0);
1 row created.
SQL> insert into foo values( 6.1 );
1 row created.
SQL> insert into foo values( 1.2345 );
1 row created.
SQL> select * from foo;
COL1
----------
9.999
0
6.1
1.235
【讨论】:
谢谢,VARCHAR 比较对我来说很有意义。 没时间去测试,但是我相信Oracle在赋值较大精度的时候会舍入或者截断。例如,您可以将 0.225232 存储在number(4, 3)
列中。
我知道上述说法不正确。当我对此进行测试时,我收到错误消息,指出该数字对于该列来说太精确了(尽管不是这些词)。
@Evan - 实际上,Shannon 是正确的,您可以尝试在列中插入一个更精确的值,它将被静默四舍五入到列定义中指定的精度。更新了我的答案以证明这一点。
我会发布我昨天做的测试——不过要到今晚才能发布。以上是关于Oracle Number 数据类型及其严格性的主要内容,如果未能解决你的问题,请参考以下文章