我需要从数据库进行数据迁移,而且我不太熟悉数据库,所以我想澄清一下。我有一些文档可以应用于Oracle或SQL数据库,它有一个列定义为NUMBER(10,5)。我想知道这意味着什么。我认为这意味着该数字有10位数,小数点后有5位,但我想澄清一下。对于SQL还是Oracle,这也会有所不同吗?
答案 0 :(得分:4)
第一个数字是精度,第二个数字是比例。 SQL Server中的等效项可以是Decimal / Numeric,您可以这样定义它:
DECLARE @MyDec decimal(18,2)
18是可以存储的最大小数位数(即总位数,例如123.45,此处的精度为5,而小数位数为2)。 2是刻度,它指定存储在小数点右侧的最大位数。
请参阅this article
请记住,存储字节越大,精度越高。所以尽可能保持最低限度。
p(精度)
指定的最大总数 可以存储的十进制数字, 在左边和右边 小数点。精度必须 是从1到最大值的值 精确。最高精度是 38.默认精度为18。
s(规模)
指定的最大数量 可存储的十进制数字 小数点右边。规模 必须是从0到p的值。 只有在可以指定比例时 指定精度。默认 比例为0;因此,0 <= s <= p。 最大存储容量因基于而异 精度。
最后,值得一提的是,在oracle中你可以定义一个大于精度的比例,例如Number(3,10)在oracle中是有效的。另一方面,SQL Server要求精度&gt; = scale。因此,如果您在oracle中定义了Number(3,10),它将映射到sql为Number(10,10)。
答案 1 :(得分:1)
在Oracle中,定义为NUMBER(4,5)的列要求小数点后第一个数字为零,并将所有值舍入小数点后的第五个数字。
NUMBER(p,s)
其中:p是精度,或者是 总位数。神谕 保证数字的可移植性 精度范围从1到38. s 是比例或数字的数字 小数点右侧。该 比例范围可以从-84到127。
以下是一些例子:
.000127
中存储的实际数据NUMBER(4,5)
变为.00013
7456123.89
中存储的实际数据NUMBER(7,-2)
变为7456100
<强>被修改强>
JonH提到一些值得注意的事情:
Oracle允许比例&gt;精确, 因此,如果s&gt; p,SQL将映射它 然后p成为s。那是NUMBER(3,4) in oracle在SQL中变为NUMERIC(4,4)。
答案 2 :(得分:1)
在Oracle中将列定义为NUMBER(10,5)意味着列值可以具有最多五个精度位的小数,以及总长度的十位数。如果在未定义任何小数位的列中插入值,则列支持的最大值为10位。例如,定义为NUMBER(10,5)的列支持这些值:
1234567890
12345.67890
它使验证成为一种痛苦。
MySQL和SQL Server不支持NUMBER数据类型 - 为了支持小数,你正在使用DECIMAL(或FLOAT?)。我没有看过PostgreSQL,但我认为它与Oracle类似。