2010-07-15 85 views
2

我需要從數據庫中進行數據遷移,並且我不太熟悉數據庫,所以我想澄清一下。我有一些文檔可以應用於Oracle或SQL數據庫,並且它有一個定義爲NUMBER(10,5)的列。我想知道這意味着什麼。我認爲這意味着數字有10位數字,小數點後5位,但我想澄清。對於SQL或Oracle,這也會有所不同嗎?數據庫字段定義

+2

如果您正在進行數據遷移,並且您甚至不知道基本的數據類型,那麼您就會感到頭疼。這不是初學者應該嘗試的任務。你需要先進的技能,你甚至沒有基本的技能。 – HLGEM 2010-07-15 15:16:55

+0

從技術上講,我沒有這樣做。但我的一位同事正在調試數據遷移問題並徵求我的意見,我們兩個人都不確定我們是否正確解釋文檔。 – user381261 2010-07-15 16:05:59

回答

4

第一個數字是精度第二個數字是比例。在SQL Server中的等價物可以作爲十進制/數字,你可以定義它像這樣:

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要求精度≥=規模。因此,如果您在Oracle中定義Number(3,10),它將映射爲Number(10,10)中的sql。

1

在Oracle中,定義爲NUMBER(4,5)的列要求小數點後的第一個數字爲零,並將小數點後的第五個數字後的所有值四捨五入。

Oracle documentation

NUMBER(p,s) 

其中:p是精度,或數字的 總數。 Oracle 保證數字 的可移植性,精度範圍爲1到38. s 是小數點右側的小數位數或小數位數 。所述 刻度範圍可以從-84到127

下面是一些例子:

存儲在 NUMBER(4,5)

實際數據.000127變得.00013存儲在NUMBER(7,-2)

實際數據7456123.89變得7456100

編輯

JonH提到值得注意的事情:

Oracle允許規模>精密, 所以SQL將其映射,這樣如果s>點 那麼p成爲S。在oracle中,NUMBER(3,4) 在SQL中成爲NUMERIC(4,4)。

+1

另外,SQL不支持比例大於精度。該op要求支持。 Oracle允許scale> precision,所以SQL將映射它,所以如果s> p,則p變成s。 oracle中的NUMBER(3,4)在SQL中成爲NUMERIC(4,4)。 – JonH 2010-07-15 14:53:23

1

在Oracle中將列定義爲NUMBER(10,5)意味着列值最多可以包含5個精度位數的小數點,並且總長度可以包含10位數字。如果您在未定義任何小數位的列中插入一個值,則該列支持的最大值爲10位數。例如,這些值將被定義爲NUMBER(10,5)的列支持:

1234567890 
12345.67890 

它使得驗證非常痛苦。

MySQL和SQL Server不支持NUMBER數據類型 - 爲了支持小數,您正在使用DECIMAL(或FLOAT?)。我沒有看過PostgreSQL,但我認爲它與Oracle相似。

+0

DECIMAL/NUMERIC是等價的並且都受SQL Server支持。在sql server中映射到oracle中的實數。 – JonH 2010-07-15 14:48:30

+1

如果您需要執行計算,請不要使用浮點數! – HLGEM 2010-07-15 15:17:37

+0

@JonH:'NUMERIC'!='NUMBER';功能類似,但關鍵字不是。聽起來像分裂頭髮,但這意味着你不能在沒有干預的情況下將腳本從一個腳本移植到另一個腳本。 – 2010-07-15 15:31:42

相關問題