Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сравнение бинари полей  [new]
Antony GL
Member

Откуда: Рудный Алтай
Сообщений: 90
День добрый!
MS SQL Server 2012 (11.0.2100.60)
Есть следующий запрос
UPDATE [mpf_clear].[dbo].[_Reference239] 
SET [_Fld3186_TYPE]=CAST('0x08' AS BINARY(1)), 
[_Fld3186_RTRef]=CAST('0x0000019B' AS BINARY(4)), 
[_Fld3186_RRRef]=CAST('0x80E5002590E2DAD711E581D884FCA627' AS BINARY(16)) 
WHERE HASHBYTES('MD5', CAST(_IDRRef AS VARBINARY(16))) = HASHBYTES('MD5', CAST('0x80E5002590E2DAD711E582B70D329C6E' AS VARBINARY(16)))

Также пробовал HASHBYTES('MD5', CAST(_IDRRef AS BINARY(16))) = HASHBYTES('MD5', CAST('0x80E5002590E2DAD711E582B70D329C6E' AS BINARY(16)))
Запись такая есть, с таким _IDRRef, но после выполнения пишет "Строк обработано 0".
Где я ошибся?

К сообщению приложен файл. Размер - 40Kb
17 окт 17, 16:40    [20876707]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение бинари полей  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
Antony GL,

declare @t table (x binary(16))
insert into @t values (0x80E5002590E2DAD711E582B70D329C6E)
select *, cast(x as varbinary(16)) from @t
select CAST('0x80E5002590E2DAD711E582B70D329C6E' AS VARBINARY(16)), convert(varbinary(16), '0x80E5002590E2DAD711E582B70D329C6E'), convert(varbinary(16), '0x80E5002590E2DAD711E582B70D329C6E', 1)
17 окт 17, 16:50    [20876734]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение бинари полей  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36694
А зачем вы бинари пихаете в строковые литералы?
17 окт 17, 16:51    [20876737]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение бинари полей  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
Гавриленко Сергей Алексеевич,

мне больше интересней нахрена для сравнения md5 xэш считать? солидней выглядит что ли?
17 окт 17, 16:55    [20876751]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение бинари полей  [new]
Antony GL
Member

Откуда: Рудный Алтай
Сообщений: 90
Гавриленко Сергей Алексеевич,
потому что в таблице данные поля имеют тип BINARY(размерность).
Когда я пробовал работать с этой таблицей, как будто в ней строковые значения (без CAST), SQL Server писал ошибку, что запрещено неявное преобразование типа данных из string в binary (или что-то в этом духе).
Если говорить только об условии, то работа с условием как со строкой, дает просто такой же результат (0 строк).
WHERE _IDRRef = '0x80E5002590E2DAD711E582B70D329C6E'
17 окт 17, 16:58    [20876760]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение бинари полей  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36694
'0x80E5002590E2DAD711E582B70D329C6E' -- это строка размером 34 байта.
0x80E5002590E2DAD711E582B70D329C6E -- это набор из 16 байт.
17 окт 17, 17:00    [20876768]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение бинари полей  [new]
Antony GL
Member

Откуда: Рудный Алтай
Сообщений: 90
Гавриленко Сергей Алексеевич,
спасибо.
Теперь работает как надо.... я почему-то заключал в кавычки.
17 окт 17, 17:01    [20876773]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение бинари полей  [new]
aleks222
Guest
felix_ff
Гавриленко Сергей Алексеевич,

мне больше интересней нахрена для сравнения md5 xэш считать? солидней выглядит что ли?


Хэш позволяет строить индекс для длинных бинарных полей.
18 окт 17, 06:06    [20877786]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить