当前位置: 首页 > 面试题库 >

将存储为VARCHAR的BINARY转换为BINARY

杨君之
2023-03-14
问题内容

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码点:048(30十六进制),f102(66十六进制),依此类推。这解释了30 30 30 33 66 38 30 30...

您要做的是将字符串解析为字节(00 03 f8 00 75 71 77 fe 66)的十六进制表示形式。CONVERT接受一个额外的“样式”参数,该参数允许您转换十六进制字符串:

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它将返回type列BINARY(8)。与该查询无关,只是为了完整性。



 类似资料:
  • 问题内容: 我在下面的查询中,需要转换为 架构图 我尝试了什么 但它们不起作用。请提出建议。 问题答案: 您将需要或作为数据类型,没有可以将数据强制转换/转换为以下数据的数据类型: 请参阅下面的SQL(实际上)在SQL Fiddle中 : 除了您试图转换为不正确的数据类型外,您所使用的语法也不正确。该函数使用以下列或值: 要么 您的原始查询的语法向后。

  • 问题内容: 我试图在我的数字列中附加一些alphabt来获取记录。但即时通讯收到错误,我尝试了强制转换和转换功能。 例如 这里StandardCost是一个数字字段,但是当我获取记录时遇到错误,请看看。 问题答案: 我认为应该 或者

  • 本文向大家介绍Dapper.NET 将varchar转换为IHtmlString,包括了Dapper.NET 将varchar转换为IHtmlString的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 问题内容: 如何将GUID字符转换为VARCHAR(32)? 我正在尝试将数据从一个表复制到另一个表。这两个表中有两个相似的列。 Table1.colx 是一个GUID,因此由于连字符的原因,它的总长度为字符 对应的列是 table2.colx, 但它是VARCHAR(32) 我正在寻找一种将GUID转换为VARCHAR的方法,但是我必须删除连字符。到目前为止,我一直没有成功找到实现此目标的方法。

  • 问题内容: 我有一个下面的SQL表: 我正在使用另一个表来存储值,例如: 要将值插入这些表中,我正在使用存储过程(其中一部分): 动态执行将引发一个异常,即不允许隐式转换sql_variant。有什么方法可以将sql_variant类型转换为varchar提供的类型?如: 其中@valueType是varchar而不是datetype 问题答案: 是的,您可以将参数作为传递给,但是您需要使用“转换