You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向VARBINARY(MAX)插入十六进制字符串结果异常的技术咨询

问题解答:SQL Server 2008插入VARBINARY(max)时0xFFFF变为0x3F的原因及解决办法

嘿,这个问题我之前也踩过一模一样的坑!让我给你拆解一下到底咋回事:

核心原因

SQL Server对十六进制字面量的默认处理规则是关键:

  • 当十六进制字面量的长度为2(对应1字节,比如0xFF),它会默认被识别为VARBINARY(1),和你的VARBINARY(max)字段类型兼容,所以插入后值保持正确。
  • 当十六进制字面量的长度超过2(比如0xFFFF对应2字节),SQL Server会默认把它当成VARCHAR类型处理!而0xFFFF对应的是不可打印的ASCII字符,SQL Server会自动将这类无法识别的字符替换成?(十六进制就是0x3F),这就是你看到ExampleWrong字段值异常的原因。

你可以自己验证一下这个规则:

-- 会返回 '?'(即0x3F)
SELECT CAST(0xFFFF AS VARCHAR)

-- 会返回 0xFFFF
SELECT CAST(0xFFFF AS VARBINARY(max))

解决办法

只需要明确强制将十六进制字面量转换为VARBINARY(max)类型即可,有两种常用方式:

方式一:使用CAST函数

INSERT INTO [dbo].[test]([ExampleWorking],[ExampleWrong])
VALUES(0xFF, CAST(0xFFFF AS VARBINARY(max)))

方式二:使用CONVERT函数

INSERT INTO [dbo].[test]([ExampleWorking],[ExampleWrong])
VALUES(0xFF, CONVERT(VARBINARY(max), 0xFFFF))

执行以上任意一种写法后,ExampleWrong字段就能正确存储0xFFFF啦!

内容的提问来源于stack exchange,提问作者Da_Rudi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:00:18