Share via


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

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析端點Microsoft Fabric 中的倉儲

使用整數資料的 Exact-number 資料類型。 若要節省資料庫中的空間,請使用能夠包含所有可能值的最小資料類型。 例如, tinyint 會足以供一個人的年齡使用,因為沒有人活著超過 255 歲。 但 tinyint 不足以滿足建築物的年齡,因為一棟建築可以超過 255 歲。

資料類型 範圍 範圍運算式 儲存體
bigint -9,223,372,036,854,775,808 至 9,223,372,036,854,775,807 -2^63 to 2^63-1 8 個位元組
int -2,147,483,648 至 2,147,483,647 -2^31 to 2^31-1 4 個位元組
smallint -32,768 至 32,767 -2^15 to 2^15-1 2 個位元組
tinyint 0 至 255 2^0-1 to 2^8-1 1 個位元組

備註

int 資料類型是 SQL Server 中的主要整數資料類型。 bigint 資料類型通常是在整數值可能超過 int 資料類型所支援的範圍時使用。

bigint 位於資料類型優先順序圖表中 smallmoneyint 之間。

僅當參數運算式的資料類型是 bigint 時,函式才會傳回 bigint。 SQL Server 不會自動將其他整數數據類型 (tinyint、smallintint) 升階為 bigint

轉換和參數化

當您使用 、 、 /或 算術運算子,對 floatrealdecimal 或 numeric 數據類型執行 intsmallinttinyint 或 bigint 常數值的隱含或明確轉換時,SQL Server 計算數據類型和運算式結果的有效位數時,會根據查詢是否自動參數化而有所不同。%*-+

因此,查詢中類似的運算式,有時候也會產生不同的結果。 當查詢未自動參數化時,常數值會先轉換成 十進位,其精確度剛好足以保存常數的值,然後再轉換成指定的數據類型。 例如,常數值1會轉換成 decimal(1,0),而常數值250轉換成 decimal(3,0)。

自動參數化查詢時,常數值一律會轉換成 decimal(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

範例

下列範例會使用 bigintintsmallint,和 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