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


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

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)

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


7023
2018-04-17 09:33


起源



答案:


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

您可以复制所需的部分数据。就我而言,我 将“0”添加到blob的末尾。 

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


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

选择返回:0x03C3F78 ...


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

选择返回:0x3C3F78 ...


我希望这将有所帮助。

最好的祝愿。


10
2018-03-16 13:57



这个解决方案对我来说非常有效(也许这个答案应该被接受)。干杯! - Tiago Fernandez


答案:


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

您可以复制所需的部分数据。就我而言,我 将“0”添加到blob的末尾。 

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


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

选择返回:0x03C3F78 ...


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

选择返回:0x3C3F78 ...


我希望这将有所帮助。

最好的祝愿。


10
2018-03-16 13:57



这个解决方案对我来说非常有效(也许这个答案应该被接受)。干杯! - Tiago Fernandez


这对于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时会发生什么?

1
2018-04-17 09:48



我选择一个返回0x3C3F78的现有值...然后将其作为新记录插入。然后选择新的返回0x03C3F78 ....前导零来自何处?它在应用程序的其他地方导致错误。 - rotary_engine
@rotary_engine:是什么 精确 你正在运行的SQL和表模式。 - gbn
updat包含架构和sql,但实际的十六进制值太大了,不能在这里发布... - rotary_engine
谢谢你的帮助。 image不是我的选择,不会为此升级所有实例。但最终使用一些c#代码将数据转换为字节数组并插入数据库。 - rotary_engine