LSN的10进制和16进制之间的转换

来源:互联网 发布:dt大数据梦工厂 spark 编辑:程序博客网 时间:2024/06/06 00:40

LSN的10进制和16进制之间的转换

 

一、16进制

LSN即日志顺序号(Log Sequence Number),用16进制表示分成3段,格式为:

 

 

FSeqNo:SectorNo:SlotNo

 

 

其含义分别为:

1)  第1段:FSeqNo是虚拟日志文件(VLF)的序列号,长度为4个字节。

2)  SectorNo是VLF中扇区的序号,长度也为4个字节。

3)  SlotNo是日志所在扇区的序号,长度为2个字节。

 

 

二、10进制

10进制下的LSN类型为NUMERIC(25,0),它也是分三段,分别是:

 

1)  从0-4位(共5位)为SlotNo

2)  从5-14位(共10位)为SectorNo

3)  从15-24位(共10位)为FSeqNo

 

各部分位数不足时,左边用0补齐(FSeqNo不需要补齐,补齐也没用)。

 

三、举例

有关10进制和16进制之间的互相转换,请参考博文:《MS SQL Server10进制和16进制之间的互相转换》

 

 

DECLARE @LSN16 VARCHAR(50)

DECLARE @LSN10 NUMERIC(25, 0)

DECLARE @LSN VARCHAR(25)

 

Set @LSN16= '00000021:00000120:0001'

 

SELECT @LSN10= CONVERT(INT,CONVERT(VARBINARY,'0X' + SUBSTRING(@LSN16, 1,  8), 1))* 1000000000000000

             +  CONVERT(INT,CONVERT(VARBINARY,'0X' + SUBSTRING(@LSN16, 10, 8), 1))* 100000

             +  CONVERT(INT,CONVERT(VARBINARY,'0X' + SUBSTRING(@LSN16, 19, 4), 1))

          

SELECT @LSN10

 

SELECT @LSN= RIGHT('0000000000'+ CONVERT(VARCHAR,@LSN10), 25)

 

SELECT CONVERT(VARCHAR(50),CONVERT(VARBINARY,CONVERT(INT,SUBSTRING(@LSN,  1, 10))), 2)+ ':'

     + CONVERT(VARCHAR(50),CONVERT(VARBINARY,CONVERT(INT,SUBSTRING(@LSN, 11, 10))), 2)+ ':'

     + CONVERT(VARCHAR(50),CONVERT(VARBINARY,CONVERT(INT,SUBSTRING(@LSN, 21, 5))), 2)

 

--返回

--33000000028800001

--00000021:00000120:00000001

 

 

0 0
原创粉丝点击