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

标签 sql sql-server sql-server-2008 tsql

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

相关文章:

sql - 如何在没有分组依据的情况下进行求和

sql - DISTINCT ON 多列,顺序很重要吗?

sql - DATEADD 未返回某些行的正确日期

c# - SQL Server 2008 + .NET3.5 + LINQ 中出现 "Server failed to resume the transaction"错误

sql - 通过根据另一个表中的值替换子字符串来更新表字段

sql - 在同一 DataResult 上加入 Found 和 Not Fund 记录

sql - 将多种格式的字符串转换为单一标准格式

sql-server - 使用c更新时MSSQL死锁(updlock)

tsql - 如何获得有序 View ?

sql - sql server 2008中的触发器