2010-11-08 103 views
0

我相信我遇到了SQL Server 2000處理十六進制數字的問題。SQL Server十六進制處理

如果我做了

select * from table where [timestamp] = 44731446 

它返回的行顯示在另一個表中的時間戳0x0000000202AA8C36

同樣,如果我

select * from table2 where [timestamp] = 44731446 

它返回的行顯示的時間戳作爲0x0000000002AA8C36(注意丟失2)

MS Calc告訴我,第一個時間戳= 8634666038(十進制),第二個時間戳= 44731446(十進制),它與我在兩個表上的原始查詢匹配。

那麼,爲什麼SQL Server返回一個不同的數字,但成功地查詢它?我相信這是我有更新問題的路線,行不會更新。

+0

什麼數據類型是您的時間戳字段?時間戳數據類型是什麼? – JNK 2010-11-08 15:53:44

+0

是的,它的時間戳 – 2010-11-08 16:04:26

+0

我知道這與數據類型太小有關(並且截斷多餘的2)。我將timestamp數據類型更改爲int,現在看起來工作正常。任何想法爲什麼? – 2010-11-08 16:08:48

回答

1

長話短說,到整數轉換二進制截斷數據:

select cast(0x0000000202AA8C36 as int) 

timestamp列是真的BINARY(8),所以您的查詢比較一個二進制文件(8)值,爲int值;由於INT具有更高的優先級,MSSQL在將二進制(8)值轉換爲INT之前將其比較。

但是,0x0000000202AA8C36(或8634666038)太大而無法表示爲INT,因此MSSQL必須首先截斷它,然後截斷爲與0x0000000002AA8C36相同的值。這可能是一個更清晰一點:

create table dbo.t (tstamp binary(8) not null) 
go 

insert into dbo.t values (0x0000000202AA8C36) 
insert into dbo.t values (0x0000000002AA8C36) 
go 

-- returns 2 rows 
select * from dbo.t where tstamp = 44731446 
-- returns 1 row 
select * from dbo.t where tstamp = cast(44731446 as bigint) 
go 

drop table dbo.t 
go 

根據聯機叢書(2008年,我沒有2000):

當[非字符串數據類型]被轉換爲二進制 或varbinary,數據是 填充或截斷在左邊。 填充是通過使用 十六進制零實現的

+0

非常感謝這肯定是我遇到的問題 – 2010-11-25 11:51:58