我有一个带整数列的表。
CREATE TABLE [dbo].[tble1](
[id] [int] NOT NULL,
[test] [nchar](10) NULL
)
当我尝试插入一些值并将空字符串传递给id列时,如下所示,它会被插入并且id列的值默认为0。
INSERT INTO [dbo].[tble1]
([id],[test])
VALUES
('','a')
我无法找到任何令人满意的推理。有人可以分享你对此的看法吗?
答案 0 :(得分:5)
正在发生的事情是''
正在转换为整数。规则是可以根据字符串中的数字字符转换字符串。
如果字符串为空,则转换为0。
因此,转换发生在非常“顶级”的水平。类型不匹配,因此SQL Server尝试隐式转换。
不幸的是,documentation在这个主题上并不是很清楚:
正在转换为精确数字的字符表达式 数据类型必须包含数字,小数点和可选项 加(+)或减号( - )。领先的空白被忽略了。逗号分隔符, 如123,456.00中的千位分隔符,是不允许的 字符串。
说实话,我会解释“必须由数字组成”,说必须至少有一个数字(虽然技术上英文“零”被视为复数,我不一定认为复数为包括零元素)。但是,空字符串已被使用 - 几乎永远 - 作为各种数据库中任何类型的有效值。
答案 1 :(得分:0)
它会尝试将''转换为整数并且它已成功。
SELECT CONVERT(INT, '')
输出
0
答案 2 :(得分:0)
您将默认值设置为0,因为您为列定义了NOT null, 如果你把ID保持为null,那么它将把NULL,
此外,如果要自动填充值,则设置列的标识