關於數據庫的16進制類型轉換,其實在數據庫裏面沒有16進制這個類型,它用的都是2進制類型varbinary存儲16進制的數據,而這些二進制數據又是以每4個bit表示一個十六進制的數據內容,往往是一個字節(Byte)佔用8個位(bit),高位4bit 表示一個十六進制數據,低位4bit 表示一個十六進制數據。存儲的時候又經常是用10進制存貯的,要切割起來就特別麻煩,那就只能10進制->2進制->字符串切割2進制->10進制。
接下來,我從網上找到一個比較簡單的轉換方法,首先介紹從varchar數據轉換到varbinary數據的方法,這個方法個人覺得比較巧妙,因爲它用到了SQL Server中的sp_executesql的方法,它可以方便的幫我們解決眼前的問題。解決辦法是這樣的:
declare @str nvarchar(1000),@a varbinary(500),@sql nvarchar(max)
set @str=N'0x12abcd'
set @sql=N'set @p='+@str+N';'
exec sp_executesql @sql,
N'@p as varbinary(500) output',
@p=@a output
select @a
上面的方法不能倒過來用,不過SQL Server提供了我們一個標量函數來解決從varbinay數據到varchar的問題,用法如下:
declare @bin varbinary(1000)
set @bin=0x12abcd
select sys.fn_varbintohexstr(@bin)
完。
因爲工作需要,下面是我根據上面這位仁兄寫的,一個把4位的16進制數據,拆分成2個字節的16進制數據,然後轉換爲2個int類型
<p>begin
declare @num2 varbinary(8),@a nvarchar(50),@b nvarchar(50),@c nvarchar(50),@d varbinary(8),@e varbinary(8)
set @num2=cast(327679 as varbinary(4))--10進制直接轉換爲2進制
set @a = sys.fn_varbintohexstr(@num2) ---2進制數轉字符串
set @b=SUBSTRING ( @a , 3 , 4 ) ----截取字符串
set @c=SUBSTRING ( @a , 7 , 4 ) </p><p>set @b=N'set @p='+'0x'+@b+N';'
exec sp_executesql @b,
<a target=_blank href="mailto:N'@p">N'@p</a> as varbinary(500) output',
@p=@d output
set @c=N'set @p='+'0x'+@c+N';'
exec sp_executesql @c,
<a target=_blank href="mailto:N'@p">N'@p</a> as varbinary(500) output',
@p=@e output
select @num2,@a,@b,@c,cast(@d as int),cast(@e as int) ----2進制轉換爲10進制輸出
end </p>
至此,大工告成。