一。類型比較
bigint:從-2^63(-9223372036854775808)到2^63-1(9223372036854775807)的整型數據,存儲大小為 8 個字節。一個字節就是8位,那么bigint就有64位
int:從-2^31(-2,147,483,648)到2^31-1(2,147,483,647)的整型數據,存儲大小為 4 個字節。int類型,最大可以存儲32位的數據
smallint:從-2^15(-32,768)到2^15-1(32,767)的整數數據,存儲大小為 2 個字節。smallint就是有16位
tinyint:從0到255的整數數據,存儲大小為 1 字節。tinyint就有8位。
二。注釋
在支持整數值的地方支持 bigint 數據類型。但是,bigint 用於某些特殊的情況,當整數值超過 int 數據類型支持的范圍時,就可以采用 bigint。在 SQL Server 中,int 數據類型是主要的整數數據類型。
在數據類型優先次序表中,bigint 位於 smallmoney 和 int 之間。
只有當參數表達式是 bigint 數據類型時,函數才返回 bigint。SQL Server 不會自動將其它整數數據類型(tinyint、smallint 和 int)提升為bigint。
三。總結
所以選擇最恰當的數據類型是非常重要的,例如,給你10個18位的全是數字的身份證號碼,和10個15位的全是數字的身份證號碼。讓你以最快的查詢的速度查找出來,這20個記錄,那么你在設計這個字段的時候,應該有幾個地方要注意:
1. 最快的查詢速度,無非我們選擇int類型的數據來存儲這20個身份證號碼。但是15位和18位的數據貌似只有bigint才滿足條件。
2. 有人要說為啥不用varchar或者char呢。直接存成一個字符串。這個問題問的比較好,首先,int的查詢速度肯定比varchar和char要快,那么int類型的數據是首選,但是int在sqlserver中有好幾種。這個就要選擇最恰當的數據類型。
---------------------------------------------------------------------------------------------------------------------------------
code:
select
STUFF((master.dbo.fn_varbintohexstr(
cast( --這是主要功能實現代碼 ,其他代碼的作用就是將前邊的 0x 去掉
CONVERT(bigint, 17) as binary(1) --'1'表示生成的16進制數的長度為2的'1'次方個,也就是最大為 FF
)
) COLLATE Latin1_General_CI_AS_KS_WS ),1,2,'')
結果: 11

一。類型比較 bigint:從-2^63(-9223372036854775808)到2^63-1(9223372036854775807)的整型數據,存儲大小為 8 個字節。一個字節就是8位,那么bigint就有64位 int:從-2^31(-2,147,483,648)到2^31-1(2,147,483,647)的整型數據,存儲大小為 4 個字節。int類型,最大可以存儲32位的數據 smallint:從-2^15(-32,768)到2^15-1(32,767)的整數數據,存儲大小為 2 個字節。smallint就是有16位 tinyint:從0到255的整數數據,存儲大小為 1 字節。tinyint就有8位。 二。注釋 在支持整數值的地方支持 bigint 數據類型。但是,bigint 用於某些特殊的情況,當整數值超過 int 數據類型支持的范圍時,就可以采用 bigint。在 SQL Server 中,int 數據類型是主要的整數數據類型。 在數據類型優先次序表中,bigint 位於 smallmoney 和 int 之間。 只有當參數表達式是 bigint 數據類型時,函數才返回 bigint。SQL Server 不會自動將其它整數數據類型(tinyint、smallint 和 int)提升為bigint。 三。總結 所以選擇最恰當的數據類型是非常重要的,例如,給你10個18位的全是數字的身份證號碼,和10個15位的全是數字的身份證號碼。讓你以最快的查詢的速度查找出來,這20個記錄,那么你在設計這個字段的時候,應該有幾個地方要注意: 1. 最快的查詢速度,無非我們選擇int類型的數據來存儲這20個身份證號碼。但是15位和18位的數據貌似只有bigint才滿足條件。 2. 有人要說為啥不用varchar或者char呢。直接存成一個字符串。這個問題問的比較好,首先,int的查詢速度肯定比varchar和char要快,那么int類型的數據是首選,但是int在sqlserver中有好幾種。這個就要選擇最恰當的數據類型。 --------------------------------------------------------------------------------------------------------------------------------- code: select STUFF((master.dbo.fn_varbintohexstr( cast( --這是主要功能實現代碼 ,其他代碼的作用就是將前邊的 0x 去掉 CONVERT(bigint, 17) as binary(1) --'1'表示生成的16進制數的長度為2的'1'次方個,也就是最大為 FF ) ) COLLATE Latin1_General_CI_AS_KS_WS ),1,2,'') 結果: 11 -- By Aaron West, 5/4/2005 -- This version allows negative numbers CREATE FUNCTION dbo.HexToINT ( @Value VARCHAR(8) ) RETURNS INT AS BEGIN if @Value LIKE '%[^0-9A-Fa-f]%' RETURN NULL DECLARE @I BIGINT SET @I = CAST(CAST(RIGHT(UPPER('00000000' + @Value),8) AS BINARY(8)) AS BIGINT) - CAST(0x3030303030303030 AS BIGINT) SET @I=@I-((@I/16)&CAST(0x0101010101010101 AS BIGINT))*7 RETURN CAST(CAST( (@I&15) +((@I/16)&240) +((@I/256)&3840) +((@I/4096)&61440) +((@I/65536)&983040) +((@I/1048576)&15728640) +((@I/16777216)&251658240) +(@I/CAST(0x0100000000000000 AS BIGINT)*268435456) AS BINARY(4))AS INT) END GO SELECT dbo.HexToINT('0ABC') , dbo.HexToINT('7FFF') , dbo.HexToINT('0FFF') , dbo.HexToINT('0') AS Zero, dbo.HexToINT('7FFFFFFF') AS MaxValue, dbo.HexToINT('80000000') AS MaxNeg, dbo.HexToINT('FFFFFFFF') AS NegOne create function dbo.ufn_vbintohexstr ( @vbin_in varbinary(256) ) returns varchar(514) as Begin declare @x bigint declare @len int declare @loop int declare @value varbinary(514) set @value = 0x set @loop = 1 set @len = datalength(@vbin_in) if (@len & 1) <> 0 set @vbin_in = 0x00 + @vbin_in if (@len & 3) < 3 set @vbin_in = 0x0000 + @vbin_in while @loop <= @len begin set @x = CAST(substring(@vbin_in,@loop,4)AS BIGINT) set @x =65536* ( (@x&0xF0000000)*4096 +(@x&0x0F000000)*256 +(@x&0x00F00000)*16 +(@x&0x000F0000) ) +(@x&0xF000)*4096 +(@x&0x0F00)*256 +(@x&0x00F0)*16 +(@x&0x000F) set @x = (@x | 0x3030303030303030)+ ((@x+0x0606060606060606)/16 & 0x0101010101010101)*7 select @value = @value + CAST(@x AS BINARY(8)) set @loop = @loop + 4 end return '0x'+ right(CAST(@value AS VARCHAR(514)), @len*2) end GO select dbo.ufn_vbintohexstr(0x123456789abcdef1234) -- outputs: 0x0123456789ABCDEF1234 GO
create function dbo.ufn_vbintohexstr ( @vbin_in varbinary(256) ) returns varchar(514) as Begin declare @x bigint declare @len int declare @loop int declare @value varbinary(514) set @value = 0x set @loop = 1 set @len = datalength(@vbin_in) if (@len & 1) <> 0 set @vbin_in = 0x00 + @vbin_in if (@len & 3) < 3 set @vbin_in = 0x0000 + @vbin_in while @loop <= @len begin set @x = CAST(substring(@vbin_in,@loop,4)AS BIGINT) set @x =65536* ( (@x&0xF0000000)*4096 +(@x&0x0F000000)*256 +(@x&0x00F00000)*16 +(@x&0x000F0000) ) +(@x&0xF000)*4096 +(@x&0x0F00)*256 +(@x&0x00F0)*16 +(@x&0x000F) set @x = (@x | 0x3030303030303030)+ ((@x+0x0606060606060606)/16 & 0x0101010101010101)*7 select @value = @value + CAST(@x AS BINARY(8)) set @loop = @loop + 4 end return '0x'+ right(CAST(@value AS VARCHAR(514)), @len*2) end GO select dbo.ufn_vbintohexstr(0x123456789abcdef1234) -- outputs: 0x0123456789ABCDEF1234 GO