SQL 服务器 - 功能中的 Hasbytes 给出与 select 中不同的结果
SQL Server - Hasbytes in function gives different result then in select
我创建了一个这样的函数:
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
关于为什么会导致这样的结果有什么想法吗?乍一看像是转换问题,但我没看出问题所在
你在那里做的不一样。 HASHBYTES
returns a varbinary
(Hashbytes (Transact-SQL) - Return Values) 因为你的函数是 returning a varchar
。这些是不同的数据类型。因此,函数的最后一行实际上是:
SET @output = CONVERT(varchar(40),HASHBYTES('SHA2_256', CAST(@CheeseName as VARCHAR(40)) + @Salt));
varbinary
的 varchar
表示将不相同。 return 一个 varbinary
在你的函数中,或者你的测试 SELECT
与 CONVERT
到 varchar(40)
.
编辑:为了确认,解决方案是简单地更改函数和变量的 return 类型:
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
我创建了一个这样的函数:
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
关于为什么会导致这样的结果有什么想法吗?乍一看像是转换问题,但我没看出问题所在
你在那里做的不一样。 HASHBYTES
returns a varbinary
(Hashbytes (Transact-SQL) - Return Values) 因为你的函数是 returning a varchar
。这些是不同的数据类型。因此,函数的最后一行实际上是:
SET @output = CONVERT(varchar(40),HASHBYTES('SHA2_256', CAST(@CheeseName as VARCHAR(40)) + @Salt));
varbinary
的 varchar
表示将不相同。 return 一个 varbinary
在你的函数中,或者你的测试 SELECT
与 CONVERT
到 varchar(40)
.
编辑:为了确认,解决方案是简单地更改函数和变量的 return 类型:
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