好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Sqlserver中tinyint,smallint,int,bigint的区别及10进制转

一。类型比较 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类型

一。类型比较

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




查看更多关于Sqlserver中tinyint,smallint,int,bigint的区别及10进制转的详细内容...

  阅读:42次