一尘不染

如何使用特定值更新varbinary字段?

sql

基本上,我试图为用户提供一定的密码,以便我可以在系统上测试某些功能,因为我只有管理员帐户,而我不能随便玩,我只是选择一个随机帐户即可进行测试。所以这是我的更新尝试:

UPDATE dbo.Login
SET
  Salt=CAST('bPftidzyAQik' AS VARBINARY),
  Password=CAST('0x2B89C2954E18E15759545A421D243E251784FA009E46F7A163926247FDB945F85F095DBB1FFF5B2B43A6ADAE27B8C46E176902412C4F8943E39528FF94E0DD5B' AS VARBINARY)
WHERE LoginID=10947

它可以正常运行,但是数据库中的代码看起来像日语,而另一种的语法看起来不错,但是它不是我输入的值,我希望它使用我输入的确切值,以便我可以登录。我要这样做吗?我尝试了几种不同的转换并没有运气就转换了解决方案。


阅读 209

收藏
2021-03-17

共1个答案

一尘不染

试试这个:

UPDATE dbo.Login
SET
  Salt=CAST('bPftidzyAQik' AS VARBINARY),
  Password=0x2B89C2954E18E15759545A421D243E251784FA009E46F7A163926247FDB945F85F095DBB1FFF5B2B43A6ADAE27B8C46E176902412C4F8943E39528FF94E0DD5B
WHERE LoginID=10947

(您无需将存储十六进制值的字符串转换为varbinary-这就是默认情况下的字符串,不带引号)

问题是,如何生成该密码的十六进制值,以及是否使用与读取时相同的编码来生成它?如果您打算将数据转换回字符串,则需要一些代码。这是我编写的用于执行此操作的函数:

CREATE FUNCTION ConvertBinary
(  
    @value AS varbinary(max)
) RETURNS VARCHAR(MAX) AS BEGIN

    DECLARE @result AS varbinary(max),
            @result2 AS varchar(max),
            @idx AS bigint;

    IF @value IS null
        return null;

    SELECT @result = @value;  
    SELECT @result2 = '';
    SELECT @idx = 1;

    WHILE substring(@result, @idx, 1) != 0 AND @idx < len(@result)
        BEGIN
            SET @result2 = @result2 + cast(substring(@result,@idx,1) as char(1));  
            SET @idx = @idx + 1;
        END

    RETURN @result2;

END

不过,我不知道这对您有多大帮助,因为无论使用这些字段的任何应用程序处理该值的可能性都可能与此功能所期望的不同。作为记录,此函数采用一个最初为utf-8字符串的varbinary值,并返回该字符串的varchar值。祝你好运!

2021-03-17