向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
相关产品推荐
相关产品推荐

