我从表(源)中执行 INSERT SELECT
,其中每列都是 VARCHAR
数据类型。
其中一列存储二进制数据,例如
'0003f80075177fe6'
我插入的目标表具有相同的列,但具有正确的数据类型 BINARY(16)
。
INSERT INTO destination
(
column1, --type of BINARY(16)
...
)
SELECT
CONVERT(BINARY(16),[varchar_column_storing_binary_data]), --'0003f80075177fe6'
FROM source
GO
当我插入它,然后选择目标表时,我从 BINARY16
列中得到了不同的值:
0x30303033663830303735313737666536
它看起来并不真正是相同的值。
将存储为 VARCHAR
的二进制数据转换为 BINARY
列的正确方法是什么?
最佳答案
您得到的结果是因为字符串“0003f80075177fe6”(一个 VARCHAR
值)被转换为代码点,并且这些代码点以二进制值的形式提供。由于您可能使用 ASCII 兼容的排序规则,这意味着您将获得 ASCII 代码点:0
是 48(30 十六进制),f
是 102(66 十六进制)等等。这解释了 30 30 30 33 66 38 30 30...
您想要做的是将字符串解析为字节的十六进制表示形式 (00 03 f8 00 75 71 77 fe 66
)。 CONVERT
接受额外的“style”参数,允许您转换十六进制字符串:
SELECT CONVERT(BINARY(16), '0003f80075177fe6', 2)
样式 2 将十六进制字符串转换为二进制。 (样式 1 对于以“0x”开头的字符串执行相同的操作,但此处的情况并非如此。)
请注意,如果少于 16 个字节(如本例所示),则该值将在右侧填充零 (0x0003F80075177FE60000000000000000
)。如果您需要左侧填充,则必须自己执行此操作:
SELECT CONVERT(BINARY(16), RIGHT(REPLICATE('00', 16) + '0003f80075177fe6', 32), 2)
最后,请注意,只需在二进制文字前面加上“0x”前缀而不使用引号即可指定二进制文字,而无需转换:SELECT 0x0003f80075177fe6
将返回 BINARY(8)< 类型的列
。与此查询无关,但只是为了完整性。
关于sql - 将存储为 VARCHAR 的 BINARY 转换为 BINARY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28566000/