You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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,再转换成对应的整数类型(比如intbigint):

-- 不带前缀转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

火山引擎 最新活动