如何在Varbinary类型的sql server表列中存储字节数组?

时间:2017-03-29 04:58:58

标签: c# sql-server

我要求使用C#代码将字节数组存储在Varbinary类型的sql server表列中。现在,当我尝试这样做时,我在sql server表中得到一个值为"0x4A6974656E6472612053616E6B686C61"的字节数组a[] = { 74, 105, 116, 101, 110, 100, 114, 97, 32, 83, 97, 110, 107, 104, 108, 97}。我不确定这是怎么做到的。我得到的值实际上是每个十进制数的六进制表示。

是否sql server在将字节数组存储到varbinary sql表列时执行了一些内部转换?

2 个答案:

答案 0 :(得分:4)

您会看到存储在字段中的实际二进制值的十六进制字符串表示形式,因为这是一个表示字节的半可读版本。它应该怎么显示?

字符串表示和实际字节不相同。大多数类型都是如此。如果存储一个整数,例如7622389,那么它实际上也存储为一些字节数(取决于字段的大小)。但是显示实际的字节而不是值的字符串表示只会令人困惑。

对于通用二进制数据,十六进制字符串格式是逻辑字符串表示。如果字节恰好构成图像文件或其他一些众所周知的文件格式,则Sql Server管理工作室可以理论上显示图片的缩略图。但由于该字段只包含通用二进制数据,因此它无法真正知道什么是最佳显示格式,因此它使用十六进制字符串。

当您实际从数据库中选择字段到C#程序时,您获得的内容通常是byte[],有时会包含在某种容器类型中。

答案 1 :(得分:1)

试试这个:

DECLARE @bin VARBINARY(MAX)=0x4A6974656E6472612053616E6B686C61;
SELECT CAST(@bin AS VARCHAR(MAX))

结果Jitendra Sankhla看起来很漂亮 - 嗯 - 适合......: - )

一些背景知识:

VARBINARY只不过是一个BLOB。在SELECT 中,呈现为HEX-string,但这不是存储实际的方式。

您可以将所有内容存储在VARBINARY列中:图片,字符串,数字,XML,复杂结构......唯一 - 但非常重要! - 重点是,你必须知道,如何阅读和解释这一点。

为什么我将其投放到VARCHAR?您的数字看起来像普通字母的ASCII码。 VARCHAR是表示 1-byte-extended-ASCII 字符串的数据类型(绑定的排序规则定义 - 就像代码页一样 - 非普通字符的解释和排序)。
假设您逐字节传递,转换为普通字符串会根据字节值导致字母。

很明显,您不会将任何二进制文件转换为字符串 0到255之间的许多值都不可打印。其他疼痛来源可能是不同的整理/代码页设置。此外,如果传入一个像utf-8这样的编码的字符串,你会得到一些错误的字符,因为utf-8会编码一些字符超过一个字符。

但是在你的简单例子中它可以工作。