当前位置: 首页 > 面试题库 >

更新SQL Server 2012中的varbinary(MAX)字段丢失了最后4位

申屠鹏
2023-03-14
问题内容

最近,我想做一些数据修补,并尝试更新 varbinary(MAX) 类型的列,更新值是这样的:

0xFFD8F … 6DC0676

但是,更新查询成功运行后,该值将变为:

0x 0 FFD8 … 6DC067

似乎最后4位丢失了,或者整个值右移了一个字节…

我试图删除整行并运行一个 插入查询 ,发生同样的事情!

谁能告诉我为什么会这样?如何解决?谢谢!

我尝试了几种不同长度的二进制文件,最大为 43658个 字符(每个字符代表4位,总计约21
KB),更新查询正常运行。再增加1个字符将使上述“错误”出现…

PS1 :对于较短长度的varbinary作为更新值,一切正常

PS2 :如果有帮助,我可以将整个二进制字符串发布出来,但是它确实很长,我不确定是否适合在这里发布

编辑: 感谢您的帮助!

就像有人建议的那样,插入的值可能是4位的奇数,因此在其前面有一个0附加值。这是我关于值的更新信息:

该值是 43677个 字符,长后缀 “ 0x”,这 是肯定的,很奇怪

它确实说明了为什么在前面插入了“ 0”,但 没有说明为什么最后一个字符消失了…

然后我做一个实验:

我插入一个 偶数长度值,并在原始值之前手动添加一个‘0’

现在要更新的值是

0x 0 FFD8F … 6DC067 6

长度为 43678个 字符,不包括“ 0x”

结果是没有运气,更新后的值仍然

0x0FFD8 … 6DC067


问题答案:

0xFFD8F...6DC0676您用于更新的二进制常量似乎包含十六进制数字的奇数个。并且SqlServer在模式的开头添加了半字节,以便表示整个字节数。

您可以通过运行以下简单查询看到相同的效果:

select 0x1, 0x104

这将返回0x010x0104

截断可能是由于SSMS的某些局限性,可以在以下实验中观察到:

declare @b varbinary(max)
set @b = 0x123456789ABCDEF0
set @b = convert(varbinary(max), replicate(@b, 65536/datalength(@b)))
select datalength(@b) DataLength, @b Data

返回的结果是655360x123456789ABCDEF0...EF0123456789ABCD,但是,如果在SSMS中复制数据列,则得到的格式为43677个字符的长度(这不带前导0x),有效长度为21838.5字节。因此,似乎(如果愿意)您不应该依赖通过SSMS中的复制/粘贴获得的长二进制数据值。

可靠的替代方法可以使用中间变量:

declare @data varbinary(max)
select @data = DataXXX from Table_XXX where ID = XXX
update Table_YYY set DataYYY = @data where ID = YYY


 类似资料:
  • 问题内容: 我需要将数据(varbinary(max))从一个表迁移到另一个表。执行更新以执行此操作时,出现以下错误 这是我用来从表DocumentPublication复制到DocumentVersion的更新 有无演员 通过逐行执行更新,我隔离了给出错误的行。奇怪的是,该字段中的数据仅为3950字节,而其他具有更少或更多(例如2000字节或20MB)的行则可以正常工作。 然后,我用另一个名称重

  • 我试图在一个路由上调用一个AJAX请求,该路由在UserController中调用这个函数updateImpression(),这个函数试图增加MySQL中存储的“users”表中名为“impressions\u cpunt”的计数器列。我试着使用Eloquent只更新一个特定用户的列。 我认为save()函数应该首先工作,但是我的数据库没有得到更新并返回原始计数,update()函数甚至没有从函

  • 问题内容: 我想做的是: 在我看来,该语句的语义首先是数据库将关闭,并为我确定全部中最大的价值是什么。然后,它将对该值加1,并将结果值分配给具有1、3、5、6和8 的行的列。似乎足够简单… 但是,当我尝试运行该查询时,MySQL对此kes之以鼻,说: 要获得我想要的结果,您必须使用什么秘诀? 问候,维克 问题答案: 尝试

  • 问题内容: 我有三个地址行列,分别为街道地址aline1,aline2,aline3。从不一致的数据开始,它们中的任何一个或全部都可以为空白。我想将第一个非空白移动到addrline1,将第二个非空白移动到addrline2,如果没有三个非空​​白行,则清除第3行,否则将其保留。(“第一个”表示aline1除非为空,否则是第一个,如果aline1为空,则aline2为第一个;如果aline1和2都

  • 我正在尝试用Angular构建一个简单的计算器,如果我想的话,我可以覆盖总数。我有这部分的工作,但当我回去输入一个数字在一个或两个领域的总数没有在该领域的更新。 这是我的jsfiddlehttp://jsfiddle.net/YUza7/2/ 形式 javascript

  • 我安装了Neo4j APOC存储过程,但我似乎只能访问其中的一些过程。例如,当我运行“call apoc.convert.tojson([1,2,3])”时,我会收到一条错误消息: APOC版本:3.1.0.3 neo4j版本:Community Edition 3.1.1 宿主:graphenedb 谢谢