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

适用于:yesSQL Server(所有支持的版本)YesAzure SQL 数据库YesAzure SQL 托管实例yesAzure Synapse Analytics yesAnalytics Platform System (PDW)

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

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

备注

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

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

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

注意

使用 +、-、*、/ 或 % 算术运算符将 int、smallint、tinyint 或 bigint 常量值隐式或显式转换为 float、real、decimal 或 numeric 数据类型时,SQL Server 计算数据类型和表达式结果的精度时应用的规则有所不同,这取决于查询是否是自动参数化的。

因此,查询中的类似表达式有时可能会生成不同的结果。 如果查询不是自动参数化的,则将常量值转换为指定的数据类型之前,首先将其转换为 numeric,该数据类型的精度很大,足以保存常量值 。 例如,常量值 1 转换为 numeric (1, 0),常量值 250 转换为 numeric (3, 0) 。

如果查询是自动参数化的,则将常量值转换为最终数据类型之前,始终先将其转换为 numeric (10, 0) 。 如果涉及 / 运算符,则对于类似查询而言,不仅结果类型的精度可能不同,而且结果值也可能不同。 例如,包含表达式 SELECT CAST (1.0 / 7 AS float) 的自动参数化查询的结果值将不同于非自动参数化的同一查询的结果值,因为自动参数化查询的结果将被截断以适合 numeric (10, 0) 数据类型 。

转换整数数据

将整数隐式转换为字符数据类型时,如果整数太大而无法容纳到字符字段中,则 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  
  
(1 row(s) affected)  

另请参阅

ALTER TABLE (Transact-SQL)
CAST 和 CONVERT (Transact-SQL)
CREATE TABLE (Transact-SQL)
DECLARE @local_variable (Transact-SQL)
SET @local_variable (Transact-SQL)
sys.types (Transact-SQL)