【问题标题】:Understanding SQL Server Int Data Types了解 SQL Server Int 数据类型
【发布时间】:2020-08-24 05:31:23
【问题描述】:

我有一个表,其中包含一个名为 PtObjId 的列,其数据类型为 INT

根据我的理解,查看位于 Microsoft Documentation 此处的线程。我最多只能存储 +/- 2,147,483,647 的值

如果我运行这个查询:

Select top 100 *
from [table]
where [PtObjId] IN (44237141916)

不应该报错吗?

为什么下面这个查询会出错:

select top 100 *
from [table]
where [PtObjID] IN ('44237141916')

但是顶部查询没有出错?

【问题讨论】:

  • 可能是隐式转换。你可能会收到where cast([PtObjId] as bigint) IN (44237141916)
  • 我根本不希望“字符串文字中的整数”执行。

标签: sql sql-server tsql int


【解决方案1】:

sqlshack-article 解释了有关 SQL-Server 中隐式转换的详细信息。

必须为比较隐式转换一个值。文字44237141916 被视为decimal,其优先级高于int,因此另一个操作数被强制转换为decimal

文章中提供了完整的优先级列表(以及可能的转换表),摘录:

10. float
11. real
12. decimal
13. money
14. smallmoney
15. bigint
16. int
17. smallint
18. tinyint 
...
25. nvarchar (including nvarchar(max))

(较小的数字 = 较高的优先级)

intnvarchar的情况下,优先级较高的是int,这会导致44237141916溢出。

【讨论】:

  • 文字 44237141916 被视为 decimal 而不是 bigint - 这是出于向后兼容性的原因,因为该行为在 bigint 数据类型出现在产品中之前就存在
  • 啊,有趣,我已经改变了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 2023-03-06
  • 2016-12-27
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多