将存储为 VARCHAR 的 BINARY 转换为 BINARY
Convert a BINARY stored as VARCHAR to BINARY
我从 table(来源)中执行 INSERT SELECT
,其中每一列都是 VARCHAR
数据类型。
其中一列存储二进制数据,如
'0003f80075177fe6'
目标 table,我插入它的地方,具有相同的列,但具有正确的数据类型 BINARY(16)
。
INSERT INTO destination
(
column1, --type of BINARY(16)
...
)
SELECT
CONVERT(BINARY(16),[varchar_column_storing_binary_data]), --'0003f80075177fe6'
FROM source
GO
当我插入它时,然后 select 目标 table,我得到了与 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
将 return 类型为 BINARY(8)
的列。与此查询无关,只是为了完整性。
我从 table(来源)中执行 INSERT SELECT
,其中每一列都是 VARCHAR
数据类型。
其中一列存储二进制数据,如
'0003f80075177fe6'
目标 table,我插入它的地方,具有相同的列,但具有正确的数据类型 BINARY(16)
。
INSERT INTO destination
(
column1, --type of BINARY(16)
...
)
SELECT
CONVERT(BINARY(16),[varchar_column_storing_binary_data]), --'0003f80075177fe6'
FROM source
GO
当我插入它时,然后 select 目标 table,我得到了与 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
将 return 类型为 BINARY(8)
的列。与此查询无关,只是为了完整性。