Двойная проблема при вставке значения в varbinary
Мы сталкиваемся с очень странной проблемой.
у нас есть одна таблица в нашей базе данных mssql 2008 R2, когда столбец таблицы следующий:
- userId - int
- userName - varbinary (256)
- 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