将十六进制字符串值插入sql server图像字段会追加额外的0

时间:2010-04-17 09:33:09

标签: tsql sql-server-2008 binary

有一个图像字段,并希望从十六进制字符串中插入:

insert into imageTable(imageField) 
values(convert(image, 0x3C3F78...))

然而,当我运行select时,返回值为0 0x03C3F78 ...

这个额外的0导致另一个应用程序出现问题,我不想要它。

如何停止添加额外的0?

架构是:

CREATE TABLE [dbo].[templates](
    [templateId] [int] IDENTITY(1,1) NOT NULL,
    [templateName] [nvarchar](50) NOT NULL,
    [templateBody] [image] NOT NULL,
    [templateType] [int] NULL)

,查询是:

insert into templates(templateName, templateBody, templateType) 
values('I love stackoverflow', convert(image, 0x3C3F786D6C2076657273696F6E3D.......), 2)

实际的十六进制字符串非常大,可以在这里发布。

2 个答案:

答案 0 :(得分:11)

我刚遇到类似的问题,我责备自己。

您可以复制所需的部分数据。就我而言,我在blob的末尾添加了'0'。

原因可能是将值从SQL Management Studio复制到剪贴板。


插入imageTable(imageField)值(0x3C3F78 ... A)

选择返回:0x03C3F78 ...


插入imageTable(imageField)值(0x3C3F78 ... A 0

选择返回:0x3C3F78 ...


我希望这会有所帮助。

祝福。

答案 1 :(得分:1)

这对于0x0是正确的:每对数字产生一个字节,因此0x00具有存储的值

当我运行SELECT convert(varbinary(max), 0x55)时,我在SQL Server 2008上得到0x55。SELECT convert(varbinary(max), 85)给我0x00000055,这是正确的,85是32位整数

您要向varbinary投射什么数据类型?

编辑:我仍然无法使用图像而不是varbinary

重现

但有些问题:

  • 这是升级后的数据库吗?什么是兼容级别?
  • 为什么要使用image:使用varbinary(max)代替
  • 将所有内容更改为varbinary会发生什么?