gpt4 book ai didi

sql - 将存储为 VARCHAR 的 BINARY 转换为 BINARY

转载 作者:行者123 更新时间:2023-12-02 22:48:33 28 4
gpt4 key购买 nike

我从表(源)中执行 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com