了解 SQL Server Int 数据类型

Lun*_*Box 1 sql t-sql sql-server int

我有一个名为列的表PtObjId中的INT数据类型。

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

如果我运行此查询:

Select top 100 *
from [table]
where [PtObjId] IN (44237141916)
Run Code Online (Sandbox Code Playgroud)

应该不会报错吧?

为什么此查询错误如下:

select top 100 *
from [table]
where [PtObjID] IN ('44237141916')
Run Code Online (Sandbox Code Playgroud)

但最上面的查询没有出错?

Kek*_*mau 7

这篇sqlshack 文章 解释了有关 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))
Run Code Online (Sandbox Code Playgroud)

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

在的情况下,intnvarchar,一个具有较高的优先级int,这导致溢出为44237141916。

  • 文字“44237141916”被视为“decimal”而不是“bigint” - 这是出于向后兼容性的原因,因为该行为在“bigint”数据类型出现在产品中之前就已存在 (2认同)