Двойная проблема при вставке значения в varbinary

Мы сталкиваемся с очень странной проблемой.

у нас есть одна таблица в нашей базе данных mssql 2008 R2, когда столбец таблицы следующий:

  1. userId - int
  2. userName - varbinary (256)
  3. userType - int

и столбец userName уникален

мы снова формируем следующий запрос к таблице:

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

и после этого запроса мы делаем следующий запрос:

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

и мы получаем следующую ошибку:

Невозможно вставить повторяющуюся строку ключа в объект "имя_таблицы" с уникальным индексом "имя_таблицы _имя_пользователя_u".

хотя 0x5942C803664B и 0x5942C803664B00 разные значения??

Любая идея?

1 ответ

Решение

Конечный "нулевой байт" 0x00 в столбце varbinary столь же незначителен, как и конечные пробелы " " в столбце 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
Другие вопросы по тегам