#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 байт).