精度是數(shù)中的數(shù)字個數(shù)。小數(shù)位數(shù)是數(shù)中小數(shù)點右邊的數(shù)字個數(shù)。例如,數(shù) 123.45 的精度是 5,小數(shù)位數(shù)是2。
numeric 和 decimal 數(shù)據(jù)類型默認的最大精度是 38。在 SQL Server 早期版本中,默認的最大值是 28。
數(shù)字數(shù)據(jù)類型的長度是存儲此數(shù)所占用的字節(jié)數(shù)。字符串或 Unicode 數(shù)據(jù)類型的長度是字符個數(shù)。binary、varbinary、和 image 數(shù)據(jù)類型的長度是字節(jié)數(shù)。例如,int 數(shù)據(jù)類型可以有 10 位數(shù),用 4 個字節(jié)存儲,不接受小數(shù)點。int 數(shù)據(jù)類型的精度是 10,長度是 4,小數(shù)位數(shù)是 0。
當兩個 char、varchar、binary 或 varbinary 表達式串聯(lián)時,結(jié)果表達式的長度是這兩個源表達式長度之和,或是 8,000 字符,以二者中少者計。
當兩個 nchar 或 nvarchar 表達式串聯(lián)時,結(jié)果表達式的長度是兩個源表達式長度之和,或是 4,000 字符,以二者中少者計。
除了 decimal 類型之外,數(shù)字數(shù)據(jù)類型的精度和小數(shù)位數(shù)是固定的。如果算術(shù)運算符有兩個相同類型的表達式,結(jié)果就為該數(shù)據(jù)類型,并且有對此類型定義的精度和小數(shù)位數(shù)。如果運算符有兩個不同數(shù)字數(shù)據(jù)類型的表達式,數(shù)據(jù)類型優(yōu)先規(guī)則決定結(jié)果的數(shù)據(jù)類型。結(jié)果為該數(shù)據(jù)類型定義的精度和小數(shù)位數(shù)。
下表定義了當運算的結(jié)果是 decimal 類型時,結(jié)果的精度和小數(shù)位數(shù)是如何計算的。當以下情況時,結(jié)果是 decimal 類型:
操作數(shù)表達式由表達式 e1(精度為 p1,小數(shù)位數(shù)為 s1)和表達式 e2(精度為 p2,小數(shù)位數(shù)為 s2)來表示。非 decimal 類型的表達式的精度和小數(shù)位數(shù),是對此表達式數(shù)據(jù)類型定義的精度和小數(shù)位數(shù)。
| 操作 | 結(jié)果精度 | 結(jié)果小數(shù)位數(shù) * |
|---|---|---|
| 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) |
* 結(jié)果精度和小數(shù)位數(shù)有絕對最大值 38。當結(jié)果精度大于 38 時,相應(yīng)的小數(shù)位數(shù)會減少,以避免結(jié)果的整數(shù)部分被截斷。