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

Откуда: Украина
Сообщений: 307
Просьба помочь.

Для проверки эквивалентности значений в строках используется HASHBYTES после конкатенации всех полей, учавствующих в сравнении. И вот с какой бедой столкнулся, покажу на примере:

Задаём значения переменных не используя латиницу:

declare @val1 varchar(15),
         @val2 nvarchar(15)

select  @val1 =  'William',
          @val2 = N'William'  


Выполняем скрипт:

select  HASHBYTES('md5', CONCAT(@val1,@val2)) as MD5_1,  
        HASHBYTES('md5', CONCAT(@val2,@val1)) as MD5_1,  
	HASHBYTES('md5', CAST(CONCAT(@val1,@val2) AS NVARCHAR(MAX))) as MD5_2,  
        HASHBYTES('md5', CAST(CONCAT(@val2,@val1) AS NVARCHAR(MAX))) as MD5_2,
	HASHBYTES('md5', CONCAT(CAST(@val1 AS NVARCHAR(15)),CAST(@val2 AS NVARCHAR(15)))) as MD5_3,  
	HASHBYTES('md5', CONCAT(CAST(@val2 AS NVARCHAR(15)),CAST(@val1 AS NVARCHAR(15)))) as MD5_3


Получаем значения одинаковые для всех трёх пар. Тут всё отлично.

Теперь задаём значения с кирилицей:

select  @val1 =  'Валера',   
        @val2 =  N'Валера'


Выполняем тот же скрипт и получаем разные значения для всех пар конкатенаций...
В чем может быть причина?

Заранее спасибо.
7 май 14, 14:33    [15985701]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать корректную работу CONCAT?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
приводите к одному типу
7 май 14, 14:39    [15985752]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать корректную работу CONCAT?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
declare @val1 varchar(15),
         @val2 nvarchar(15)

select  @val1 =  'Валера',   
        @val2 =  N'Валера'

select  
	HASHBYTES('md5', @val1 + @val2) as MD5_1,
	HASHBYTES('md5', @val2 + @val1) as MD5_2


одинаково
7 май 14, 14:43    [15985781]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать корректную работу CONCAT?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Virtuoz,

а вы посмотреть, что в @val1 оказалось, пробовали?
ну, просто сделать select @val1.
7 май 14, 14:59    [15985904]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать корректную работу CONCAT?  [new]
Virtuoz
Member

Откуда: Украина
Сообщений: 307
автор
а вы посмотреть, что в @val1 оказалось, пробовали?


Знаки вопросов.

Получается что для того, чтобы мой HASHBYTES работал корректно я должен гарантировать, что все значение, которые будут приходить на вход будут в nvarchar(). Так?
7 май 14, 15:25    [15986122]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать корректную работу CONCAT?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Virtuoz,

ну, да. либо гарантировать, что скрипт будет выполняться в контексте базы с кириллическим collation-ом.
7 май 14, 15:38    [15986218]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать корректную работу CONCAT?  [new]
Virtuoz
Member

Откуда: Украина
Сообщений: 307
Сейчас установлен колейшен: Latin1_General_100_CI_AS.

А если попадется символ не кирилицы, к примеру китайский иераглиф или какой-нибудь умляут символ? ...
7 май 14, 15:43    [15986242]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать корректную работу CONCAT?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
если будет в поле NVARCHAR , то ничего страшного, в противном случае возможны проблемы
7 май 14, 15:46    [15986260]     Ответить | Цитировать Сообщить модератору
 Re: Как гарантировать корректную работу CONCAT?  [new]
Virtuoz
Member

Откуда: Украина
Сообщений: 307
Огромное спасибо за ответы.
7 май 14, 15:49    [15986275]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить