为什么`1`不适合十进制(4, 4)列?

jus*_*mer 3 sql-server-2008 decimal

decimal(4, 4)在 MS SQL Server 2008 R2 中有一个列。如果我理解正确,这意味着:

  • Precision of 4,即小数点后最多可存储四位
  • Scale of 4,即一共可以存储四位数字

当我运行更新命令将列设置为1( update myTable set myDecimalColumn=1) 时,出现此错误:

将数字转换为数字数据类型时出现算术溢出错误。

我不明白这是怎么回事。 1小数点后没有数字,只有一位长。

Seb*_*ine 7

Precision规定的可存储数字,总数Scale指定,有多少的这些数字生活的小数点后面。

DECIMAL(4,4)因此,A有四位数字,并且都在小数点后面。这意味着您可以存储从 -0.9999 到 0.9999 的值。您不能存储 -1 或 1,因为它们在小数点前有一个数字。

SQL小提琴

查询 1

SELECT CAST(-0.9999 as DECIMAL(4,4)),CAST(0.123456 as DECIMAL(4,4)),CAST(0.9999 as DECIMAL(4,4))
Run Code Online (Sandbox Code Playgroud)

结果

| COLUMN_0 | COLUMN_1 | COLUMN_2 |
----------------------------------
|  -0.9999 |   0.1235 |   0.9999 |
Run Code Online (Sandbox Code Playgroud)

要存储 1,您必须添加一个额外的数字,如DECIMAL(5,4). 这允许您存储从 -9.9999 到 9.9999 的值:

SQL小提琴

查询 2

SELECT CAST(-9.9999 as DECIMAL(5,4)),CAST(1 as DECIMAL(5,4)),CAST(9.9999 as DECIMAL(5,4))
Run Code Online (Sandbox Code Playgroud)

结果

| COLUMN_0 | COLUMN_1 | COLUMN_2 |
----------------------------------
|  -9.9999 |        1 |   9.9999 |
Run Code Online (Sandbox Code Playgroud)