【问题标题】:How a byte array is being stored in sql server table column of type Varbinary?字节数组如何存储在 Varbinary 类型的 sql server 表列中?
【发布时间】:2017-03-29 04:58:58
【问题描述】:

我有一个要求,我想使用 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 表列时执行一些内部转换?

【问题讨论】:

  • 您想知道它是如何存储在 db 中的,还是想取回实际的字节数组?
  • 请浏览这个link,它表示VARBINARY(MAX) 数据类型在存储和检索方面的行为方式。据我所知,值的二进制表示可能会随着 SQL Server 的版本而变化。这个link 将帮助您转换二进制和 varbinary 数据

标签: c# sql-server


【解决方案1】:

试试这个:

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

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

一些背景:

VARBINARY 只不过是一个 BLOB。在SELECT 呈现为十六进制字符串,但这不是它存储实际的方式

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

为什么我要把它投给VARCHAR?你的数字看起来像普通字母的 ASCII 码。 VARCHAR 是表示 1-byte-extended-ASCII 字符串的数据类型(绑定排序规则定义 - 就像代码页 - 非纯字符的解释和排序)。
假设您逐个字节地传递,转换为普通字符串会根据字节的值生成字母。

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

但在您的简单示例中它可以工作。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 2011-03-17
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多