SQL Server中CONVERT函数解析十六进制字符串需指定风格参数:用2(无0x前缀)或1(带0x前缀),否则默认转ASCII;如CONVERT(VARBINARY,'1A2B',2)→0x1A2B,而直接CONVERT(VARBINARY,'1A2B')→0x31413242。

CONVERT 函数在 SQL Server 中不支持直接解析十六进制字符串为二进制值
SQL Server 的 CONVERT 本身不能把形如 '0x1A2B' 或 '1A2B' 这样的字符串自动转成 VARBINARY;它只做类型转换,不带解析逻辑。如果你直接写 CONVERT(VARBINARY, '1A2B'),结果是字节序列 0x31413242(即 ASCII 编码),不是你想要的十六进制解码值 0x1A2B。
正确做法:用 0x 前缀 + CONVERT 或直接用 0x 字面量
SQL Server 支持以 0x 开头的十六进制字面量,只要字符串格式合法,CONVERT(VARBINARY, ...) 就能识别并转为对应二进制值:
- ✅ 正确:
CONVERT(VARBINARY(4), '0x1A2B')→ 得到0x1A2B - ✅ 正确:
CONVERT(VARBINARY(4), '0x00FF12')→ 得到0x00FF12 - ❌ 错误:
CONVERT(VARBINARY(4), '1A2B')→ 得到0x31413242(ASCII) - ⚠️ 注意:字符串必须是偶数位,且只含 0–9、A–F(大小写不敏感);否则报错
Conversion failed when converting from a character string to uniqueidentifier or varbinary
动态拼接 0x 前缀时需确保输入干净
如果十六进制字符串来自变量或列(比如 @hexstr = '1A2B'),不能直接 CONVERT(VARBINARY, '0x' + @hexstr) —— 因为 SQL Server 在运行时不会对拼接后的字符串做隐式解析。必须用 EXEC 或 sp_executesql 动态执行,或改用 CAST + 0x 字面量方式(仅限常量)。更稳妥的方案是用内置函数:
- SQL Server 2016+ 推荐用
CONVERT(VARBINARY, @hexstr, 2)—— 第三个参数2表示“输入是纯十六进制字符串(无 0x 前缀)” - 例如:
CONVERT(VARBINARY(10), 'FFAABBCC', 2)→0xFFAABBCC - 若输入带
0x前缀,用1作为风格参数:CONVERT(VARBINARY(10), '0xFFAABBCC', 1) - 风格参数只对
CHAR/VARCHAR→VARBINARY有效;反过来(VARBINARY→ 字符串)也用同样参数控制输出格式
MySQL 或 PostgreSQL 用户别套用这个语法
MySQL 没有 CONVERT(..., style) 重载,得用 UNHEX('1A2B');PostgreSQL 用 decode('1a2b', 'hex')。SQL Server 的 style 参数(1/2)是独有行为,跨数据库移植时极易出错。另外,CONVERT(VARBINARY, '0x...') 中的 0x 是 SQL Server 特有字面量语法,其他引擎不认。
最易被忽略的是:风格参数 2 要求输入严格为偶数长度、全大写或小写十六进制字符,中间不能有空格或前导零以外的修饰——哪怕多一个 0 都会静默截断或报错。

















