Sqlserver中tinyint, smallint, int, bigint的区别 及 10进制转换16进制的方法
一。類型比較
bigint:從-2^63(-9223372036854775808)到2^63-1(9223372036854775807)的整型數(shù)據(jù),存儲(chǔ)大小為 8 個(gè)字節(jié)。一個(gè)字節(jié)就是8位,那么bigint就有64位
int:從-2^31(-2,147,483,648)到2^31-1(2,147,483,647)的整型數(shù)據(jù),存儲(chǔ)大小為 4 個(gè)字節(jié)。int類型,最大可以存儲(chǔ)32位的數(shù)據(jù)
smallint:從-2^15(-32,768)到2^15-1(32,767)的整數(shù)數(shù)據(jù),存儲(chǔ)大小為 2 個(gè)字節(jié)。smallint就是有16位
tinyint:從0到255的整數(shù)數(shù)據(jù),存儲(chǔ)大小為 1 字節(jié)。tinyint就有8位。
二。注釋
在支持整數(shù)值的地方支持bigint數(shù)據(jù)類型。但是,bigint用于某些特殊的情況,當(dāng)整數(shù)值超過int數(shù)據(jù)類型支持的范圍時(shí),就可以采用bigint。在 SQL Server 中,int數(shù)據(jù)類型是主要的整數(shù)數(shù)據(jù)類型。
在數(shù)據(jù)類型優(yōu)先次序表中,bigint位于smallmoney和int之間。
只有當(dāng)參數(shù)表達(dá)式是bigint數(shù)據(jù)類型時(shí),函數(shù)才返回bigint。SQL Server 不會(huì)自動(dòng)將其它整數(shù)數(shù)據(jù)類型(tinyint、smallint和int)提升為bigint。
三。總結(jié)
所以選擇最恰當(dāng)?shù)臄?shù)據(jù)類型是非常重要的,例如,給你10個(gè)18位的全是數(shù)字的身份證號(hào)碼,和10個(gè)15位的全是數(shù)字的身份證號(hào)碼。讓你以最快的查詢的速度查找出來(lái),這20個(gè)記錄,那么你在設(shè)計(jì)這個(gè)字段的時(shí)候,應(yīng)該有幾個(gè)地方要注意:
1. 最快的查詢速度,無(wú)非我們選擇int類型的數(shù)據(jù)來(lái)存儲(chǔ)這20個(gè)身份證號(hào)碼。但是15位和18位的數(shù)據(jù)貌似只有bigint才滿足條件。
2. 有人要說(shuō)為啥不用varchar或者char呢。直接存成一個(gè)字符串。這個(gè)問題問的比較好,首先,int的查詢速度肯定比varchar和char要快,那么int類型的數(shù)據(jù)是首選,但是int在sqlserver中有好幾種。這個(gè)就要選擇最恰當(dāng)?shù)臄?shù)據(jù)類型。
---------------------------------------------------------------------------------------------------------------------------------
code:
select
STUFF((master.dbo.fn_varbintohexstr(
cast( --這是主要功能實(shí)現(xiàn)代碼 ,其他代碼的作用就是將前邊的 0x 去掉
CONVERT(bigint,17) as binary(1) --'1'表示生成的16進(jìn)制數(shù)的長(zhǎng)度為2的'1'次方個(gè),也就是最大為 FF
)
) COLLATE Latin1_General_CI_AS_KS_WS ),1,2,'')
結(jié)果:11
View Code
一。類型比較
bigint:從-2^63(-9223372036854775808)到2^63-1(9223372036854775807)的整型數(shù)據(jù),存儲(chǔ)大小為 8 個(gè)字節(jié)。一個(gè)字節(jié)就是8位,那么bigint就有64位
int:從-2^31(-2,147,483,648)到2^31-1(2,147,483,647)的整型數(shù)據(jù),存儲(chǔ)大小為 4 個(gè)字節(jié)。int類型,最大可以存儲(chǔ)32位的數(shù)據(jù)
smallint:從-2^15(-32,768)到2^15-1(32,767)的整數(shù)數(shù)據(jù),存儲(chǔ)大小為 2 個(gè)字節(jié)。smallint就是有16位
tinyint:從0到255的整數(shù)數(shù)據(jù),存儲(chǔ)大小為 1 字節(jié)。tinyint就有8位。
二。注釋
在支持整數(shù)值的地方支持 bigint 數(shù)據(jù)類型。但是,bigint 用于某些特殊的情況,當(dāng)整數(shù)值超過 int 數(shù)據(jù)類型支持的范圍時(shí),就可以采用 bigint。在 SQL Server 中,int 數(shù)據(jù)類型是主要的整數(shù)數(shù)據(jù)類型。
在數(shù)據(jù)類型優(yōu)先次序表中,bigint 位于 smallmoney 和 int 之間。
只有當(dāng)參數(shù)表達(dá)式是 bigint 數(shù)據(jù)類型時(shí),函數(shù)才返回 bigint。SQL Server 不會(huì)自動(dòng)將其它整數(shù)數(shù)據(jù)類型(tinyint、smallint 和 int)提升為bigint。
三。總結(jié)
所以選擇最恰當(dāng)?shù)臄?shù)據(jù)類型是非常重要的,例如,給你10個(gè)18位的全是數(shù)字的身份證號(hào)碼,和10個(gè)15位的全是數(shù)字的身份證號(hào)碼。讓你以最快的查詢的速度查找出來(lái),這20個(gè)記錄,那么你在設(shè)計(jì)這個(gè)字段的時(shí)候,應(yīng)該有幾個(gè)地方要注意:
1. 最快的查詢速度,無(wú)非我們選擇int類型的數(shù)據(jù)來(lái)存儲(chǔ)這20個(gè)身份證號(hào)碼。但是15位和18位的數(shù)據(jù)貌似只有bigint才滿足條件。
2. 有人要說(shuō)為啥不用varchar或者char呢。直接存成一個(gè)字符串。這個(gè)問題問的比較好,首先,int的查詢速度肯定比varchar和char要快,那么int類型的數(shù)據(jù)是首選,但是int在sqlserver中有好幾種。這個(gè)就要選擇最恰當(dāng)?shù)臄?shù)據(jù)類型。
---------------------------------------------------------------------------------------------------------------------------------
code:
select
STUFF((master.dbo.fn_varbintohexstr(
cast( --這是主要功能實(shí)現(xiàn)代碼 ,其他代碼的作用就是將前邊的 0x 去掉
CONVERT(bigint, 17) as binary(1) --'1'表示生成的16進(jìn)制數(shù)的長(zhǎng)度為2的'1'次方個(gè),也就是最大為 FF
)
) COLLATE Latin1_General_CI_AS_KS_WS ),1,2,'')
結(jié)果: 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
總結(jié)
以上是生活随笔為你收集整理的Sqlserver中tinyint, smallint, int, bigint的区别 及 10进制转换16进制的方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。