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

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics分析平台系统 (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库Microsoft Fabric 预览版中的 SQL 数据库

使用整数数据的精确数字数据类型。 若要节省数据库空间,请使用能够可靠包含所有可能值的最小数据类型。 例如, tinyint 足以用于具有状态值的小型查阅表格,因为它可以存储多达 256 行。 但是 tinyint 不足以列出员工,因为你的公司可能有数百或数千名员工。

数据类型 Range 范围表达式 存储
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 个字节

Remarks

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

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

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

转换和参数化

使用 +int-%*/smallint、tinyint 或bigint 常量值的隐式或显式转换为 floatrealdecimalnumeric 数据类型时,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

Examples

以下示例将使用 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