SQL Server 2005中十六进制字符串转二进制及整数的实现方法
在SQL Server中正确转换十六进制字符串为二进制或整数
踩过这个坑的人都懂——那些基于SQL Server 2008的老方法放到现在用,要么返回一堆乱码一样的二进制值,要么完全不是你想要的结果。你之前试的那些例子,比如CONVERT(binary(16),'0x01',1)返回0x30783031000000000000000000000000,本质是SQL Server把你的十六进制字符串当成了普通文本字符,转成了对应的ASCII编码,而不是真正解析成十六进制值。
下面给你说两种场景的正确解法:
一、十六进制字符串转二进制(varbinary)
这里的关键是匹配字符串前缀和CONVERT的style参数,同时注意字符串类型:
如果你的十六进制字符串不带
0x前缀(比如'01'),用style=2,并且确保输入是varchar类型(如果是nvarchar,先转成varchar):-- 正确转换不带前缀的varchar字符串 SELECT CONVERT(varbinary(max), '01', 2); -- 结果:0x01 -- 如果是nvarchar类型,先转成varchar再处理 SELECT CONVERT(varbinary(max), CAST(N'01' AS varchar(max)), 2); -- 结果:0x01如果你的十六进制字符串带
0x前缀(比如'0x01'),用style=1,同样要确保输入是varchar类型:-- 正确转换带前缀的varchar字符串 SELECT CONVERT(varbinary(max), '0x01', 1); -- 结果:0x01 -- nvarchar转varchar后再处理 SELECT CONVERT(varbinary(max), CAST(N'0x01' AS varchar(max)), 1); -- 结果:0x01
二、十六进制字符串转整数
有两种简单可靠的方式,适合不同场景:
方法1:先转二进制再转整数
先按上面的方法把十六进制字符串转成varbinary,再转换成对应的整数类型(比如int、bigint):
-- 不带前缀转int SELECT CONVERT(int, CONVERT(varbinary(4), '01', 2)); -- 结果:1 -- 带前缀转bigint SELECT CONVERT(bigint, CONVERT(varbinary(8), '0x7FFFFFFF', 1)); -- 结果:2147483647
方法2:用XML的value方法(更通用)
这种方法不需要纠结style参数,只要给字符串加上0x前缀(没有的话手动拼接),再转成XML后提取数值即可,支持更大的数值范围:
-- 带前缀直接转int SELECT CAST('0x01' AS xml).value('.', 'int'); -- 结果:1 -- 不带前缀手动加0x转bigint SELECT CAST('0x' + 'FF' AS xml).value('.', 'bigint'); -- 结果:255
为什么之前的尝试失败?
你之前得到的0x30783031其实是字符串'0x01'的ASCII编码(0是0x30,x是0x78,1是0x31),这是因为要么你用了nvarchar类型的输入(Unicode字符串会让style参数失效),要么style参数和字符串前缀不匹配(比如带前缀却用了style=2)。
内容的提问来源于stack exchange,提问作者Ian Boyd




