介紹
SQL Server在整數值超過int數據類型支持的範圍時,將使用 bigint數據類型。為了實現兼容性,int數據類型仍是 Microsoft SQL Server 2005 中的主要整數數據類型。
除非明確說明,否則那些接受int表達式作為其參數的函式、語句和系統存儲過程都不會改變,從而不會支持將 bigint表達式隱式轉換為這些參數。因此,當 bigint值在int數據類型支持的範圍內時,SQL Server 才將 bigint隱式轉換為int。如果 bigint表達式包含了一個在int數據類型支持範圍之外的值,就會在運行時出現轉換錯誤。
數據類型
儘管int依然是SQL Server 2000中最主要的整數數據類型,但是SQL Server 2000還是新增加了整數數據類型bigint,它套用於整數超過int數據範圍的場合。
int數據類型所表示的數值範圍從-2^31到2^31-1,也就是說,你可以用int數據類型來表達-2,147,483,648到2,147,483,647(即大約正負二十億)之間的整數。一個int型占用四個位元組的存儲空間。
而bigint可以精確的表示從-2^63到2^63-1(即從-9,223,372,036,854,775,808到 9,223,372,036,854,775,807)之間的整數,它占用了八個位元組的存儲空間。
套用場合
Transact-SQL
儘管 SQL Server 有時會將 tinyint或 smallint值提升為 int數據類型,但不會自動將 tinyint、smallint 或 int 值提升為 bigint數據類型。例如,如果參數表達式的數據類型是 tinyint或 smallint,某些聚合函式會把返回值的數據類型提升為 int,而這些聚合函式將不會返回 bigint 數據類型的值,除非參數表達式本身就是 bigint 類型。
當指定 bigint參數並且返回值也是 bigint 類型時,可以使用下列 Transact-SQL 函式。
ABS FLOOR POWER AVG IDENTITY RADIANS CEILING MAX
ROUND COALESCE MIN SIGN DEGREESNULLIFSUM
當引用 bigint 列或變數,但不希望返回值也為 bigint數據類型時,可以使用下列函式。
@@IDENTITY ISNULL VARP COL_LENGTH ISNUMERIC
DATALENGTH STDEV[P]
SQL Server 提供下列專門使用 bigint值的函式。
COUNT_BIG
當對組中的項目計數時,如果值超過 int 數據類型支持的範圍,並且返回 bigint 數據類型的值,則使用此函式。除了返回的數據類型外,COUNT_BIG 類似於 COUNT 函式。
ROWCOUNT_BIG
當對執行的最後一條語句所影響的行數進行計數,而且值超過 int 數據類型支持範圍時,使用此函式。除了 ROWCOUNT_BIG 返回 bigint數據類型外,此函式類似於 ROWCOUNT 函式。
其他 Transact-SQL
CAST 和 CONVERT 子句支持 bigint。這些子句對 bigint使用與其他整數數據類型相同的轉換規則。在數據類型優先表中,bigint數據類型位於int之上和 smallmoney 之下。有關 bigint轉換的詳細信息,請參閱 CAST 和 CONVERT (Transact-SQL)。
在使用 CASE表達式時,如果 result_expression 或可選的 else_result_expression 的值是 bigint數據類型,將得到 bigint 類型的結果。
可以在 Transact-SQL 語句中指定了整數數據類型的所有語法位置使用 bigint 數據類型:
* ALTER PROCEDURE
* ALTER TABLE
* CREATE PROCEDURE
* CREATE TABLE
* DECLARE變數
此外,SQL Server 目錄組件報告有關 bigint列的信息。
套用操作
指定 bigint 常量
在int數據類型支持範圍之外的數字常量仍被解釋為 numeric,這些數字的小數位數為 0,其精度為足以保存所指定的值。例如,常量 3000000000 被解釋為 numeric。這些 numeric 常量被隱式轉換為 bigint,並可對 bigint 列和變數賦值:
CREATE TABLE BigintTable (ColA bigint)
INSERT INTO BigintTable VALUES (3000000000)
SELECT *
FROM BigintTable
WHERE ColA = 3000000000
還可以將常量轉換為 bigint:
CAST(3000000000 AS bigint)
若要將 bigint值放入 sql_variant 列中,請使用此方法:
CREATE TABLE VariantTable (ColA sql_variant)
-- Inserts a value with a numeric base data type.
INSERT INTO VariantTable VALUES (3000000000)
-- Inserts a value with a bigintbase data type.
INSERT INTO VariantTable VALUES ( CAST(3000000000 AS bigint) )
注意事項
當你使用bigint時,需要留意下面幾點:
在數據類型優先表中,bigint數據類型位於int之上、smallmoney之下。
SQL Server不能自動的把int型數據轉換成bigint型。如果函式的參數表達式是一個bigint類型時,函式只能返回bigint類型的數據。使用bigint數據類型的函式有AVG、CEILING、FLOOR、MAX、MIN、ROUND以及SUM等等。可以在指定了整型數據的所有語法位置使用bigint數據類型:ALTER PROCEDURE、ALTER TABLE、CREATE PROCEDURE、CREATE TABLE以及 DECLARE變數。你可以在SQL Server目錄組件(catalog components)得到bigint欄的信息
你可能會對為什麼任何人都有可能需要使用bigint數據類型這一問題感到疑惑。實際上,這個問題並不難以回答,例如當你的資料庫需要進行大數據運算時(如信用卡公司常常會碰到這種情況),你就需要使用bigint數據類型。
在支持整數值的地方支持 bigint 數據類型。但是,bigint 用於某些特殊的情況,當整數值超過 int 數據類型支持的範圍時,就可以採用 bigint。在 SQL Server 中,int 數據類型是主要的整數數據類型。
在數據類型優先次序表中,bigint 位於 smallmoney 和 int 之間。
只有當參數表達式是 bigint 數據類型時,函式才返回 bigint。SQL Server 不會自動將其它整數數據類型(tinyint、smallint 和 int)提升為 bigint。
int(M) 在 integer 數據類型中,M 表示最大顯示寬度。在 int(M) 中,M 的值跟 int(M) 所占多少存儲空間並無任何關係。和數字位數也無關係 int(3)、int(4)、int(8) 在磁碟上都是占用 4 btyes 的存儲空間。
注意,所有算術運算用有符號的BIGINT或DOUBLE值完成,因此你不應該使用大於9223372-36854-775807(63位)的有符號大整數,除了位函式!注意,當兩個參數是INTEGER值時,-、+和*將使用BIGINT運算!這意味著如果你乘2個大整數(或來自於返回整數的函式),如果結果大於9223372-36854-775807,你可以得到意外的結果。一個浮點數字,不能是無符號的,對一個單精度浮點數,其精度可以是<=24,對一個雙精度浮點數,是在25和53之間,這些類型如FLOAT和DOUBLE類型馬上在下面描述。FLOAT(X)有對應的FLOAT和DOUBLE相同的範圍,但是顯示尺寸和小數位數是未定義的。在MySQL3.23中,這是一個真正的浮點值。在更早的MySQL版本中,FLOAT(precision)總是有2位小數。該句法為了ODBC兼容性而提供。