首页 > 解决方案 > 将 VARCHAR 转换为 BINARY(16)

问题描述

我正在尝试解码包含二进制数据作为varchar数据类型的 SQL Server 列。

我在其他一些主题和地方看到了如何将其转换为二进制文件,但不幸的是,他们的解决方案对我不起作用。

我有一个名为的表名TABLE_TEST,其中有 1 列称为SomeData数据varchar(400)类型。

如果我点击编辑表格,我会看到那里有一些数据,但如果我运行一个简单的查询:

SELECT SomeData 
FROM TABLE_TEST

数据不会显示为二进制数据。

所以在其他一些地方阅读,我继续尝试:

SELECT CONVERT(BINARY(16), SomeData, 1)  
FROM TABLE_TEST

我还尝试了样式 2,它显示:

消息 8114,级别 16,状态 5,第 1
行将数据类型 varchar 转换为 varbinary 时出错。

我知道这些数据完全没问题,因为当我在 c# 应用程序中读取它时,我只是这样做:

byte[] someDataBuffer = new byte[400];
MemoryStream someDataStream = new MemoryStream(someDataBuffer);
BinaryReader binaryReader = new BinaryReader(someDataStream);
Int32 data1 = binaryReader.ReadInt32();
Int16 data2 = binaryReader.ReadInt16();
Int16 data3 = binaryReader.ReadInt16();

有没有办法在 SQL 端获得相同的结果或查询?我的意思是一个查询,它将 varchar 列转换为二进制,然后我可以在 SQL 中以相同的方式读取该数据结构。

EDIT1:
请注意,二进制列的大小是 400,所以基本上是 varchar(400),而我每次读取的方式都在 for 循环中 50 次。因为每个循环我都会读取一个 Int32,然后是 Int16 和 Int16。所以这意味着总共 8 个字节 * 50 次 = 400(列的大小)。

我虽然运行它是这样的:

DECLARE @i int = 0;
WHILE @i < 50
BEGIN
    -- Read Int32
    -- Read Int16
    -- Read Int16
    SET @i = @i + 1;    
END   

但是我将如何每次解码那里的部分数据?

EDIT2:
看起来@DavidDubois 的答案走向了正确的方向。但是我仍然不确定为什么当我尝试在 SQL 中读取该数据时它不起作用,这可能是一些编码问题。我添加了一张图片来显示它的外观,因此它给出了这个想法: 当我尝试选择此数据或复制此数据时,它不会复制任何内容。这就是为什么它让我认为编码设置为特殊的。我如何检查这个? 该数据库和列的排序规则设置为:
在此处输入图像描述

SQL_Latin1_General_CP1_CI_AS

标签: c#sql-serverbinary

解决方案


这应该可以帮助您:

DECLARE @TestString VARCHAR(100) = 'Test' ;

SELECT  @TestString AS [Raw],
        CONVERT(VARBINARY(100), @TestString) AS BinaryFromString,
        CONVERT(VARCHAR(100), CONVERT(VARBINARY(100), @TestString)) AS StringFromBinary ;

你可以在这里测试它:http ://rextester.com/OZRW13368


推荐阅读