bigint为
Transact-SQL的系统
数据类型,当整数值超过
int数据范围时才可以使用。为了实现
兼容性,int数据类型仍是 Microsoft SQL Server 2005 中的主要整数数据类型。
基本介绍
SQL Server在整数值超过int数据类型支持的范围时,将使用 bigint数据类型。
除非明确说明,否则那些接受
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)之间的整数,它占用了八个字节的存储空间。
应用场合
尽管 SQL Server 有时会将 tinyint或 smallint值提升为 int数据类型,但不会自动将 tinyint、smallint 或 int 值提升为 bigint数据类型。例如,如果参数
表达式的数据类型是 tiny
int或 smallint,某些
聚合函数会把
返回值的数据
类型提升为 int,而这些聚合函数将不会返回 bigint 数据类型的值,除非参数表达式本身就是 bigint 类型。
当指定 bigint参数并且返回值也是 bigint 类型时,可以使用下列 Transact-
SQL 函数。
ABS FLOOR POWER AVG IDENTITY RADIANS CEILING MAX
ROUND COALESCE MIN SIGN DEGREES
NULLIFSUM
当引用 bigint 列或变量,但不希望返回值也为 bigint数据类型时,可以使用下列函数。
@@IDENTITY ISNULL VARP COL_LENGTH ISNUMERIC
SQL Server 提供下列专门使用 bigint值的函数。
COUNT_BIG
当对组中的项目计数时,如果值超过 int 数据类型支持的范围,并且返回 bigint 数据类型的值,则使用此函数。除了返回的数据类型外,COUNT_BIG 类似于 COUNT 函数。
当对执行的最后一条语句所影响的行数进行计数,而且值超过 int 数据类型支持范围时,使用此函数。除了 ROWCOUNT_BIG 返回 bigint数据类型外,此函数类似于 ROWCOUNT 函数。
其他 Transact-SQL
CAST 和 CONVERT
子句支持 big
int。这些子句对 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 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兼容性而提供。