假设我们有一个表帐户,有一个字段 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。或者总是在用于字符串列的值周围使用引号,而不是依赖于隐式转换。
| 归档时间: |
|
| 查看次数: |
338 次 |
| 最近记录: |