有效位數、小數位數和長度 (Transact-SQL)

有效位數 (Precision) 是指數字的位數。 小數位數 (Scale) 則是指數字中小數點右方的位數。 例如,123.45 這個數字的有效位數是 5,小數位數是 2。

在 SQL Server 中,numeric 和 decimal 資料類型的預設最大有效位數為 38。 在舊版的 SQL Server 中,預設的最大值是 28。

數值資料類型的長度是用來儲存數字的位元組數目。 字元字串或 Unicode 資料類型的長度是字元的數目。 binary、varbinary 和 image 資料類型的長度是位元組數。 例如,int 資料類型可以保留 10 位數,儲存在 4 位元組中,不接受小數點。 int 資料類型的有效位數是 10,長度是 4,小數位數是 0。

當串連兩個 char、varchar、binary 或 varbinary 運算式時,產生的運算式長度是兩個來源運算式長度的總和,或 8,000 字元,兩者取較小者。

當串連兩個 nchar 或 nvarchar 運算式時,產生的運算式長度是兩個來源運算式長度的總和,或 4,000 字元,兩者取較小者。

當利用 UNION、EXCEPT 或 INTERSECT 來比較長度不同之相同資料類型的運算式時,產生的長度是兩個運算式的最大長度。

decimal 兩旁數值資料類型的有效位數和小數位數是固定的。 如果算術運算子有兩個相同類型的運算式,結果會有相同的資料類型,且會有定義給這個類型的有效位數和小數位數。 如果運算子有兩個含不同數值資料類型的運算式,資料類型優先順序的規則會定義這個結果的資料類型。 結果會有定義給它的資料類型的有效位數和小數位數。

下表定義在運算結果是 decimal 類型時,如何計算結果的有效位數和小數位數。 當符合下列中的任何條件時,結果便是 decimal:

  • 兩個運算式都是 decimal。

  • 一個運算式為 decimal,另一個運算式為優先順序低於 decimal 的資料類型。

運算元運算式表示成運算式 e1 (有效位數是 p1,小數位數是 s1) 和運算式 e2 (有效位數是 p2,小數位數是 s2)。 任何不是 decimal 之運算式的有效位數和小數位數,都是定義給運算式資料類型的有效位數和小數位數。

運算

結果有效位數

結果小數位數 *

e1 + e2

max(s1, s2) + max(p1-s1, p2-s2) + 1

max(s1, s2)

e1 - e2

max(s1, s2) + max(p1-s1, p2-s2) + 1

max(s1, s2)

e1 * e2

p1 + p2 + 1

s1 + s2

e1 / e2

p1 - s1 + s2 + max(6, s1 + p2 + 1)

max(6, s1 + p2 + 1)

e1 { UNION | EXCEPT | INTERSECT } e2

max(s1, s2) + max(p1-s1, p2-s2)

max(s1, s2)

e1 % e2

min(p1-s1, p2 -s2) + max( s1,s2 )

max(s1, s2)

* 結果有效位數及小數位數的絕對最大值為 38。 當結果有效位數大於 38 時,會縮減對應的小數位數,以防止截斷結果的整數部分。

請參閱

參考

運算式 (Transact-SQL)

資料類型 (Transact-SQL)