当inserint值为varbinary时重复出现问题

时间:2013-04-25 09:07:15

标签: sql sql-server-2008 duplicates varbinary

我们面临一个非常奇怪的问题。

我们的mssql 2008 R2 db中有一个表,表格列如下:

  1. userId - int
  2. userName - varbinary(256)
  3. userType - int
  4. 且userName列是唯一的

    我们再次对表格进行以下查询:

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

    在该查询之后,我们执行以下查询:

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

    我们收到以下错误:

      

    无法在对象'table_name'中插入具有唯一索引'table_name _userName_u'的重复键行。

    虽然0x5942C803664B和0x5942C803664B00是不同的值?

    有什么想法吗?

1 个答案:

答案 0 :(得分:6)

varbinary列中的尾随“零字节”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

为了进行比较,最后一个字节(8位为0)被认为是无关紧要的。这与你获得

的原因相同
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