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 个在小数点后?

感谢您的帮助!

【问题讨论】:

A number(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 数据类型及其严格性的主要内容,如果未能解决你的问题,请参考以下文章

oracle数据库中的number数据类型疑问

oracle数据库中“Number”是啥类型?

数据类型转换

说知道oracle中int类型和number类型区别

oracle中number数值类型

Mysql 支持的字符类型