c# - 将 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
解决方案
这应该可以帮助您:
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
推荐阅读
- c# - 如何从单独的测试项目中使用位于 web api 项目中的 json 文件
- javascript - React,将组件导出到 index.js,然后从文件夹中导入它们(React native)
- typescript - 如何在 TypeScript 中重载接口?
- android - Jetpack Compose 中连续运动的动画
- sql - 垂直合并到组内的多行
- python-3.x - 使用 Python Selenium 选择 textarea 中的所有文本
- nginx - Nginx proxy_pass 删除uri中的路径
- flutter - Flutter textfieldcontroller默认值不适用于变量
- python - 为什么我的浏览器中的网页输出与我通过抓取该网页获得的页面源代码不匹配?
- python - 使用示例日期时间值初始化数据框