4

私たちは非常に奇妙な問題に直面しています。

テーブル列が次の場合、mssql 2008 R2 データベースに 1 つのテーブルがあります。

  1. ユーザー ID - 整数
  2. ユーザー名 - varbinary(256)
  3. ユーザータイプ - int

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 は異なる値ですが??

何か案が ?

4

1 に答える 1

6

varbinary 列の末尾の「ゼロバイト」 0x00 は、varchar 列の末尾のスペース " " と同じくらい重要ではありません。したがって、値は実際には重複しています。

つまり、2 つの値は (バイト順で)

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 に答える