【问题标题】:SQL Server - Hasbytes in function gives different result then in selectSQL Server - 函数中的 Hasbytes 给出不同的结果然后在选择中
【发布时间】:2018-11-15 20:40:02
【问题描述】:

我创建了一个这样的函数:

CREATE FUNCTION dbo.HashCheeseName (@CheeseName NVARCHAR(40)) 
RETURNS VARCHAR(40) 
AS BEGIN
 DECLARE @Salt VARCHAR(25)
 DECLARE @CheeseName NVARCHAR(40)
 DECLARE @output VARCHAR(40) 
 SET @Salt = '123abc11aa'

 SET @output = HASHBYTES('SHA2_256', CAST(@CheeseName as VARCHAR(40)) + @Salt)
 RETURN @output
END
;

当我刚跑的时候

SELECT HASHBYTES('SHA2_256', CAST('SwissCheese' as VARCHAR(40)) + @Salt)

我得到了一个预期的结果,例如 0xF456D41144584064AC5456B7E3...

但是,当我在查询中运行该函数时

SELECT dbo.HashCheeseName('SwissCheese')

我得到这样的结果:h:Mó!yýŠù’p» ªu_aøP¾æhw

对为什么会导致这样的结果有任何想法吗?乍一看似乎是转换问题,但我没有看到问题

【问题讨论】:

  • ...但是你说函数返回VARCHAR(40)。当然,SQL Server 会将其转换为那个。 (实际类型为VARBINARY(8000)。)

标签: sql-server tsql salt


【解决方案1】:

你在那里做的不一样。 HASHBYTES 返回一个 varbinary (Hashbytes (Transact-SQL) - Return Values),因为您的函数返回一个 varchar。这些是不同的数据类型。因此,函数的最后一行实际上是:

SET @output = CONVERT(varchar(40),HASHBYTES('SHA2_256', CAST(@CheeseName as VARCHAR(40)) + @Salt));

varbinaryvarchar 表示将不同。在你的函数中返回一个varbinary,或者你的测试SELECT和一个CONVERT到一个varchar(40)

编辑:确认一下,解决方案是简单地更改函数和变量的返回类型:

CREATE FUNCTION dbo.HashCheeseName (@CheeseName NVARCHAR(40)) 
RETURNS varbinary(8000)
AS BEGIN
    DECLARE @Salt VARCHAR(25);
    DECLARE @CheeseName NVARCHAR(40);
    DECLARE @output varbinary(8000) ;
    SET @Salt = '123abc11aa';

    SET @output = HASHBYTES('SHA2_256', CAST(@CheeseName as VARCHAR(40)) + @Salt);
    RETURN @output;
END

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    相关资源
    最近更新 更多