4

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

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

  1. 用户 ID - 整数
  2. 用户名 - varbinary(256)
  3. 用户类型 - 整数

并且 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 _userName_u”的对象“table_name”中插入重复的键行。

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

任何的想法 ?

4

1 回答 1

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

出于比较的目的,最后一个字节(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
于 2013-04-25T09:09:45.043 回答