Использование значения столбца varchar (8000) в функции HashByte md5

#sql-server

#sql-сервер

Вопрос:

Я хочу создать хэш, используя все значения строк в SQL. В этой таблице длина одного столбца равна varchar(8000).Я ввел функцию hashbyte, как показано ниже —

 Hashbyte('MD5',column1 column2 ....) -- column1 having varchar(8000) length and it contains string of length 8000.
  

Затем он дает мне тот же хэш-байт, в котором строки имеют одинаковое значение в column1, даже если другие столбцы содержат разные данные

Затем я преобразовал column1 в varchar (max) в функции hashbyte, я получил разные хэш-байты для каждой строки.

 Hashbyte('MD5',convert(varchar(max),column1) column2 ....)
  

Почему hashbyte(‘MD5’ …) не принимает все значения столбца?

Если вы хотите попробовать еще один пример проблемы с столбцом varchar (8000) — попробуйте вычислить длину

создайте таблицу, содержащую столбец с varchar(8000), и вычислите длину всех значений столбца. Это даст вам только 8000. Затем преобразуйте varchar(8000) в varchar (max), это даст вам правильный результат.

 len(column1 column2...) --> 8000
len(convert(varchar(max),column1) column2...) --> actual length
  

добавление любой строки с помощью varchar(8000) является такой проблемой?

Ответ №1:

Вы ошибочно полагаете, что a varchar(8000) , объединенное с a varchar(8000) (или даже любой другой длиной <= 8000), приводит к a varchar(MAX) . Это неверно. Чтобы получить MAX длину, вы должны определить хотя бы одно из значений в выражении как a MAX .

Это подтверждается в замечаниях в (Конкатенация строк) (Transact-SQL):

Примечания

Если результат конкатенации строк превышает ограничение в 8000 байт, результат усекается. Однако, если хотя бы одна из объединенных строк имеет большой тип значения, усечение не происходит.

В результате вам нужно сначала преобразовать одно из значений MAX в, а затем остальные также будут неявно преобразованы в a MAX . Если вы явно не преобразуете (по крайней мере) одно из выражений, значение будет усечено, как указано в документации.

Очевидно, это относится и к nvarchar тому, где усечение происходит в 4000 символов (что по-прежнему составляет 8000 байт).