我们有一个系统,我们将时间序列数据存储在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错误,或者我做错了什么,因为它将决定我们应该如何解决这种情况: - )
答案 0 :(得分:3)
LEN
将varbinary
转换为varchar
并测量字符串长度。这排除了可能导致差异的any trailing blanks。在二进制文件的末尾添加一个零字节会使其长度增加尾随空白加一。
所以这不是一个错误。正如Dan指出的那样,使用DATALENGTH
。