基本上我试图给用户一个特定的密码,所以我可以测试系统上的一些功能,因为我只有我们的管理帐户,我不能玩,我只是选择一个随机帐户,所以我可以做我的测试。下面是我尝试更新的内容:
UPDATE dbo.Login
SET
Salt=CAST('bPftidzyAQik' AS VARBINARY),
Password=CAST('0x2B89C2954E18E15759545A421D243E251784FA009E46F7A163926247FDB945F85F095DBB1FFF5B2B43A6ADAE27B8C46E176902412C4F8943E39528FF94E0DD5B' AS VARBINARY)
WHERE LoginID=10947
它运行良好,然而,在数据库中的代码看起来日语为一个和语法为另一个看起来很好,但它不是我输入的值,我希望它使用我输入的确切值,所以我可以登录。我该怎么做呢?我已经尝试了几种不同的转换和转换解决方案,没有运气。
试试这个:
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值。好运!
由于您使用的是2008,请尝试以下操作:
UPDATE dbo.Login
SET
Salt=CAST('bPftidzyAQik' AS VARBINARY),
Password=CONVERT(VARBINARY(MAX), '0x2B89C2954E18E15759545A421D243E251784FA009E46F7A163926247FDB945F85F095DBB1FFF5B2B43A6ADAE27B8C46E176902412C4F8943E39528FF94E0DD5B', 1)
WHERE LoginID=10947
(http://blogs.msdn.com/b/sqltips/archive/2008/07/02/converting-from-hex-string-to-varbinary-and-vice-versa.aspx)