为什么int列值默认为' 0'什么时候空??

时间:2017-03-28 11:57:28

标签: sql sql-server database

我有一个带整数列的表。

CREATE TABLE [dbo].[tble1](
    [id] [int] NOT NULL,
    [test] [nchar](10) NULL
)

当我尝试插入一些值并将空字符串传递给id列时,如下所示,它会被插入并且id列的值默认为0。

INSERT INTO [dbo].[tble1]
       ([id],[test])
 VALUES
       ('','a')

我无法找到任何令人满意的推理。有人可以分享你对此的看法吗?

3 个答案:

答案 0 :(得分:5)

正在发生的事情是''正在转换为整数。规则是可以根据字符串中的数字字符转换字符串。

如果字符串为空,则转换为0。

因此,转换发生在非常“顶级”的水平。类型不匹配,因此SQL Server尝试隐式转换。

不幸的是,documentation在这个主题上并不是很清楚:

  

正在转换为精确数字的字符表达式   数据类型必须包含数字,小数点和可选项   加(+)或减号( - )。领先的空白被忽略了。逗号分隔符,   如123,456.00中的千位分隔符,是不允许的   字符串。

说实话,我会解释“必须由数字组成”,说必须至少有一个数字(虽然技术上英文“零”被视为复数,我不一定认为复数为包括零元素)。但是,空字符串已被使用 - 几乎永远 - 作为各种数据库中任何类型的有效值。

答案 1 :(得分:0)

它会尝试将''转换为整数并且它已成功。

SELECT CONVERT(INT, '')

输出

0

答案 2 :(得分:0)

您将默认值设置为0,因为您为列定义了NOT null, 如果你把ID保持为null,那么它将把NULL,

此外,如果要自动填充值,则设置列的标识