关于c#:使用TransactSQL将字节数组转换为字符串

Convert Byte Array to string using TransactSQL

我们使用C和BinaryFormatter将字符串值存储在使用varbinary类型的数据库中。我们转换为字节数组,然后保存到数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static byte[] ToBytes(stringvalue)
{
  if (value == null)
    return null;

  byte[] inMemoryBytes;
  using (MemoryStream inMemoryData = new MemoryStream())
  {
    new BinaryFormatter().Serialize(inMemoryData, value);
    inMemoryBytes = inMemoryData.ToArray();
  }

  return inMemoryBytes;
}

好的,如果我们保存字符"A",我们可以在数据库中看到"0x0001000000000FFFF010000000000000000006010000000110B"。在我们可以检索数据并再次转换为字符串之后。
我们是否可以仅使用Transact-SQL将此二进制值("0x0001000000000ffffffff010000000000000000006010000000110b")转换为char("a")(以便我们可以从SQL Server控制台进行修改、插入和比较)?

谢谢。


我建议使用http://msdn.microsoft.com/en-us/magazine/cc163473.aspx描述的方法来使用.NET regex库。特别是clr用户定义函数的部分。您可以简单地使用BinaryFormatter反序列化字节数组。

1
2
3
4
5
6
7
8
9
[SqlFunction]
public static string ToStringFromBytes(byte[] value)
{ if (value == null) return null;

  using (MemoryStream inMemoryData = new MemoryStream(value))
  {
    return new BinaryFormatter().Deserialize(inMemoryData) as string;
  }
}


你可以用一些简单的东西,比如

1
Encoding.Default.GetBytes("a");

它将返回"61",并且可以更容易地转换为varchar,只需运行以下命令:

1
2
3
create table #sample (content varbinary(max));
insert into  #sample values (0x61)
select cast(content as varchar) from #sample


为什么不能将原始字符串存储在nvarchar(MAX)类型的列中?如果必须使用varbinary类型列,那么至少要使用System.Text.Encoding类进行转换,然后还可以在SQL中解码字符串:

1
2
3
4
5
public static byte[] ToBytes(string value)
{
  if (value == null) return null;
  return System.Text.Encoding.Unicode.GetBytes(value);
}

然后像这样使用:

1
select cast(VarBinaryField as nvarchar(max)) from SomeTable