int、bigint、smallint 和 tinyint (Transact-SQL)

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics 分析平台系统 (PDW) Microsoft Fabric 中的 SQL 分析端点 Microsoft Fabric 中的仓库

使用整数数据的精确数字数据类型。 若要节省数据库空间,请使用能够可靠包含所有可能值的最小数据类型。 例如, tinyint 足以满足一个人的年龄,因为没有人活在255岁以上。 但 tinyint 不足以满足建筑物的年龄,因为一栋建筑可以超过 255 岁。

数据类型 范围 范围表达式 存储
bigint -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 -2^63 到 2^63-1 8 字节
int -2,147,483,648 到 2,147,483,647 -2^31 到 2^31-1 4 字节
smallint -32,768 到 32,767 -2^15 到 2^15-1 2 个字节
tinyint 0 到 255 2^0-1 到 2^8-1 1 个字节

备注

int 数据类型是 SQL Server 中的主要整数数据类型 。 bigint 数据类型用于整数值可能超过 int 数据类型支持范围的情况 。

在数据类型优先次序表中,bigint 介于 smallmoney 和 int 之间 。

仅当参数表达式为 bigint 数据类型时,函数才返回 bigint 。 SQL Server 不会自动将其他整数数据类型(tinyint、smallintint)提升为 bigint

转换和参数化

使用 +-*/%算术运算符对 intsmallint、tinyint 或 bigint 常量值 执行隐式或显式转换时,SQL Server 在计算数据类型和表达式结果精度时应用的规则取决于查询是否自动参数。

因此,查询中的类似表达式有时可能会生成不同的结果。 当查询未自动参数化时,常量值首先转换为 十进制值,其精度足以容纳常量的值,然后再转换为指定的数据类型。 例如,常量值1转换为十进制(1,0),常量值250转换为十进制(3,0)。

自动参数化查询时,常量值始终转换为 十进制(10,0), 然后再转换为最终数据类型。 如果涉及 / 运算符,则对于类似查询而言,不仅结果类型的精度可能不同,而且结果值也可能不同。 例如,包含表达式 SELECT CAST (1.0 / 7 AS float)的自动参数化查询的结果值与未自动参数化的同一查询的结果值不同,因为自动参数化查询的结果将被截断,以适应 decimal(10,0) 数据类型。

Microsoft Fabric 不支持 tinyint 数据类型。

转换整数数据

当整数隐式转换为字符数据类型时,如果整数太大而无法容纳到字符字段中,SQL Server 将使用 ASCII 字符 42(星号)。*>。

大于 2,147,483,647 的整数常量将转换为 decimal 数据类型,而不是 bigint 数据类型 。 下面的示例显示当超过此阈值时,结果的数据类型将从 int 变为 decimal 。

SELECT 2147483647 / 2 AS Result1, 2147483649 / 2 AS Result2;

结果集如下。

Result1      Result2
-----------  ------------------
1073741823   1073741824.500000

示例

以下示例将使用 bigint、int、smallint 和 tinyint 数据类型创建一个表 。 值插入到每列中并在 SELECT 语句中返回。

CREATE TABLE dbo.MyTable (
    MyBigIntColumn BIGINT,
    MyIntColumn INT,
    MySmallIntColumn SMALLINT,
    MyTinyIntColumn TINYINT
);
GO

INSERT INTO dbo.MyTable
VALUES (
    9223372036854775807,
    2147483647,
    32767,
    255
);
GO

SELECT MyBigIntColumn,
    MyIntColumn,
    MySmallIntColumn,
    MyTinyIntColumn
FROM dbo.MyTable;

结果集如下。

MyBigIntColumn       MyIntColumn MySmallIntColumn MyTinyIntColumn
-------------------- ----------- ---------------- ---------------
9223372036854775807  2147483647  32767            255