有效位數、小數位數和長度 (Transact-SQL)
有效位數是數字的位數。小數位數是數字中在小數點右側的位數。例如,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 時,會縮減對應的小數位數,以防止截斷結果的整數部分。