如何防止整数在 SQL Server 中默默地变成星号?

Ank*_*ush 9 sql sql-server

假设我们有一个表帐户,有一个字段 acct_type varchar(2)

Insert into account(acct_type) values(888)
Run Code Online (Sandbox Code Playgroud)

输出:

+-----------+
| acct_type |
+-----------+
| *         |
+-----------+
Run Code Online (Sandbox Code Playgroud)

我预计它会在插入语句触发时抛出错误。为什么它*在表中存储值?

Mar*_*ith 11

对于varchar数据类型,截断的int将被转换为*而不是抛出错误(在这种情况下,因为三位数字不适合 a varchar(2))。

这不会发生 nvarchar

没有办法改变这种行为,它是为了向后兼容而保留的。如果这对您来说是一个真正的问题,您可以添加一个检查约束,该列中的值不是,*但我无法想象这真的值得做的任何情况。

解决方案就是不这样做。如果您必须插入一个,INT则首先验证它是否在范围内-9 to 99。或者总是在用于字符串列的值周围使用引号,而不是依赖于隐式转换。

  • 我认为真正的问题是:如果他们想存储整数值,那么为什么这是一个“varchar”? (4认同)