Sql 将存储为VARCHAR的二进制文件转换为二进制文件

Sql 将存储为VARCHAR的二进制文件转换为二进制文件,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我从一个表(源代码)中执行一个INSERT-SELECT,其中每个列都是VARCHAR数据类型 其中一列存储二进制数据,如 '0003f80075177fe6' 我在其中插入的目标表具有相同的列,但具有适当的数据类型BINARY(16) 当我插入它,然后选择目标表时,我从BINARY16列中得到了一个不同的值: 0x30303033663830303735313737666536 它看起来真的不是相同的值 将存储为VARCHAR列的二进制数据转换为binary列的正确方法是什么?您得到的结果

我从一个表(源代码)中执行一个
INSERT-SELECT
,其中每个列都是
VARCHAR
数据类型

其中一列存储二进制数据,如

'0003f80075177fe6'
我在其中插入的目标表具有相同的列,但具有适当的数据类型
BINARY(16)

当我插入它,然后选择目标表时,我从
BINARY16
列中得到了一个不同的值:

0x30303033663830303735313737666536
它看起来真的不是相同的值


将存储为
VARCHAR
列的二进制数据转换为
binary
列的正确方法是什么?

您得到的结果是,字符串“0003f80075177fe6”(a
VARCHAR
值)被转换为代码点,这些代码点作为二进制值提供。由于您可能正在使用与ASCII兼容的排序规则,这意味着您将获得ASCII代码点:
0
是48(30十六进制),
f
是102(66十六进制),依此类推。这解释了
30 30 33 66 38 30 30…

您要做的是将字符串解析为字节的十六进制表示形式(
0003f8 00757177fe66
)。接受一个额外的“样式”参数,该参数允许您转换十六进制字符串:

SELECT CONVERT(BINARY(16), '0003f80075177fe6', 2)
样式2将十六进制字符串转换为二进制。(样式1对以“0x”开头的字符串执行相同的操作,但这里的情况并非如此。)

请注意,如果少于16个字节(如本例中所示),则该值用零填充(
0x0003f80075177fe6000000000000000
)。如果您需要填充,您必须自己完成:

SELECT CONVERT(BINARY(16), RIGHT(REPLICATE('00', 16) + '0003f80075177fe6', 32), 2)

最后,请注意,只需在二进制文本前加上“0x”而不使用引号,就可以在不进行转换的情况下指定它们:
SELECT 0x0003f80075177fe6
将返回类型为
binary(8)
的列。与此查询无关,只是为了完整性

嘿,杰罗恩,这是有效的…这对我来说不是很直观,但它最终是有意义的。。。如果你在这里,我会拥抱你,谢谢!我扩展了答案,试图澄清任何剩余的困惑。
SELECT CONVERT(BINARY(16), RIGHT(REPLICATE('00', 16) + '0003f80075177fe6', 32), 2)