精度是數中的數字個數。小數位數是數中小數點右邊的數字個數。例如,數 123.45 的精度是 5,小數位數是2。
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 字符,以二者中少者計。
除了 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) | 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) |
* 結果精度和小數位數有絕對最大值 38。當結果精度大於 38 時,相應的小數位數會減少,以避免結果的整數部分被截斷。