我有一个整数列的表。

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

当我尝试插入一些值并像下面这样向id列传递空字符串时,它将被插入,默认情况下id列的值为0。
INSERT INTO [dbo].[tble1]
       ([id],[test])
 VALUES
       ('','a')

我找不到任何令人满意的理由。有人能分享一下你的想法吗?

最佳答案

正在发生的是''正在被转换成一个整数。规则是可以根据字符串中的数字字符转换字符串。
如果字符串为空,则将其转换为0。
所以,转换发生在最“顶层”。类型不匹配,因此SQL Server尝试隐式转换。
不幸的是,documentation并不是很清楚这个话题:
正在转换为精确数字的字符表达式
数据类型必须由数字、小数点和可选的
加号(+)或减号(-)。前导空格被忽略。逗号分隔符,
例如123456.00中的千位分隔符,在
字符串。
老实说,我会将“必须由数字组成”解释为必须至少有一个数字(尽管在英语中,“零”在技术上被视为复数,但我不一定认为复数包括零元素)。然而,空字符串已经被用作(几乎是永久的)一个有效值,可用于广泛的数据库中的任何类型。

关于sql - 当传递空值时,为什么int列值默认为'0'?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43068948/

10-11 07:15