在 HashByte md5 函数中使用 varchar(8000) 列值

Posted

技术标签:

【中文标题】在 HashByte md5 函数中使用 varchar(8000) 列值【英文标题】:Using varchar(8000) column value in HashByte md5 function 【发布时间】:2020-09-25 17:12:58 【问题描述】:

我想使用 SQL 中的所有行值创建一个散列。在该表中,列长度之一是 varchar(8000)。我放了一个如下所示的 hashbyte 函数-

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

然后它给我相同的哈希字节,即使其他列包含不同的数据,列 1 中的行具有相同的值

然后我在 hashbyte 函数中将 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】:

您误以为varchar(8000) 连接到varchar(8000)(甚至任何其他长度varchar(MAX)。这不是真的。要获得MAX 的长度,您必须将表达式中的至少一个值定义为MAX

这在+ (String Concatenation) (Transact-SQL)的评论中得到了证实:

备注

...

如果字符串连接的结果超过 8,000 字节的限制,结果将被截断。但是,如果连接的字符串中至少有一个是大值类型,则不会发生截断。

因此,您需要先将其中一个值转换为MAX,然后将其余值也隐式转换为MAX。如果您没有显式转换(至少)其中一个表达式,则该值将被截断,如文档所述。

显然这也适用于nvarchar,其中在 4,000 个字符(仍为 8,000 个字节)处发生截断。

【讨论】:

以上是关于在 HashByte md5 函数中使用 varchar(8000) 列值的主要内容,如果未能解决你的问题,请参考以下文章

javascript中使用md5函数

oracle 有md5函数么

jmeter函数助手(一)一行代码实现MD5加密

php MD5的定义用法

Sql Server内置函数实现MD5加密

VC++对字符串进行加密的MD5String和获取文件MD5值的MD5File函数的封装(附源码)