2013-04-25 37 views
4

我們面臨一個非常奇怪的問題。varbinary中的inserint值時出現重複問題

我們有我們的MSSQL 2008 R2的DB一個表時,表列是如下:

  1. 用戶id - 詮釋
  2. 用戶名 - VARBINARY(256)
  3. USERTYPE - 詮釋

和userName列是唯一的

我們prefor m以下再次查詢該表:

insert into table_name (userId, userName, userType) values (1 , 0x5942C803664B00, 0) 

和查詢,我們做了以下查詢後:

insert into table_name (userId, userName, userType) values (2 , 0x5942C803664B, 0) 

,我們得到以下錯誤:

Cannot insert duplicate key row in object 'table_name ' with unique index 'table_name _userName_u'.

雖然0x5942C803664B和0x5942C803664B00是不同的值

有什麼想法?

+0

您是否發佈了導致問題的確切用戶名。我無法使用您的值複製此錯誤。 http://sqlfiddle.com/#!3/2faf2/1 – GarethD 2013-04-25 09:19:01

+2

@GarethD你做得不對。您正在將一個字符串投射到varbinary。如果你看看你的小提琴結果(第一選擇),你可以看到兩個',48,48',它們是兩個字節,序數值48代表ASCII字符「0」。那些不是字節0x00。試試這個,而不是'INSERT T VALUES(0x5942C803664B00),(0x5942C803664B);' – RichardTheKiwi 2013-04-25 09:24:56

+0

哇。顯然我需要更多的咖啡,並且可能會仔細檢查我今天上午所做的一切,因爲這是一個非常基本的錯誤......哎呀。 – GarethD 2013-04-25 09:52:52

回答

6

varbin列中尾隨的「零字節」0x00與varchar列中的尾隨空格「」無關。因此,你的價值實際上是重複的。

換句話說,你的兩個值(以字節順序)

1 2 3 4 5 6 7 --- bytes in the binary value 
59 42 C8 03 66 4B 
59 42 C8 03 66 4B 00 

的最後一個字節(0 8位)被認爲是微不足道的用於比較的目的。這與你爲什麼得到相同的原因

select CASE WHEN 'abc ' = 'abc' then 'SAME' else 'DIFFERENT' end 
-- select case when 0x5942C803664B = 0x5942C803664B00 then 'same' else 'different' end 

result 
====== 
SAME 

爲了使尾隨的零字節有意義,你可以作弊併爲兩個部分添加相同的東西。

select case when 0x5942C803664B + 0xff = 0x5942C803664B00 + 0xff 
      then 'same' 
      else 'different' end -- different 

select case when 0x5942C80366AA + 0xff = 0x5942C80366AA + 0xff 
      then 'same' 
      else 'different' end -- same 
+1

但0x5942C803664B和0x5942C803664B00是不同的數字......什麼叫柱式不會忽略這個?我會明白0x5942C803664B和0x005942C803664B是一樣的嗎? – MoShe 2013-04-25 09:12:39