SQL Server blob损坏

时间:2014-12-01 12:46:24

标签: sql-server

我们有一个系统,我们将时间序列数据存储在SQL Server 2008 R2的BLOB字段中

该表看起来像这样(简化,一些列被跳过):

CREATE TABLE T_TimeSeries (
ID bigint IDENTITY(1,1) NOT NULL,
Tag varchar(80) NOT NULL,
Count int NOT NULL,
data varbinary(max) NULL)

我有一个python进程,用于连续追加'数据'并递增'计数'。 一个不变量是len(data)==4*Count应该始终保持。我将这个不变量作为代码中的断言。偶尔(每两个月左右),这个断言失败 - 其中len(data)将比预期值短一个字节。

为了“修复”数据并让我的进程继续而没有断言违规,我试图附加一个零字节。但是这会使blob的长度增加两倍!!

以下是我的详细信息:

select TSMode, 4*count as count4, len(data) as len 
from T_TimeSeries where Tag='<tag-of-the-affected-row>'

这会产生:

count4  len
233776  233775

然后我追加零字节,如下所示:

update T_TimeSeries set data.Write(0x00, NULL, 0) where Tag='<tag-of-the-affected-row>'
得到:

SELECT

count4  len
233776  233777

这不是SQL Server中的错误的明确证据吗?我追加一个字节,长度从233775跳到233777。 我可以不断重复它 - 用data.write(0x,233776,1)删除一个字节,以恢复到233775的长度。

我的过程的正常数据写入模式并不总是按线性顺序排列 - 有时我们插入中间,替换现有数据。但无论我们采取什么步骤,我都认为我们永远不应该处于这种状态 - 它看起来像是数据库损坏。

你同意吗?

我想知道它确实是一个SQL Server错误,或者我做错了什么,因为它将决定我们应该如何解决这种情况: - )

1 个答案:

答案 0 :(得分:3)

LENvarbinary转换为varchar并测量字符串长度。这排除了可能导致差异的any trailing blanks。在二进制文件的末尾添加一个零字节会使其长度增加尾随空白加一。

所以这不是一个错误。正如Dan指出的那样,使用DATALENGTH