【问题标题】:How to update a varbinary field with a specific value?如何使用特定值更新 varbinary 字段?
【发布时间】:2012-01-23 22:20:40
【问题描述】:

基本上我想给用户一个特定的密码,这样我就可以在系统上测试一些功能,因为我只有我们的管理员账户,我不能玩,我只是选择一个随机账户,所以我可以做我的测试。所以这是我的更新尝试:

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

它运行良好,但是数据库中的代码其中一个看起来是日语,另一个看起来不错,但它不是我输入的值,我希望它使用我输入的确切值,以便我可以签名我该怎么做?我尝试了几种不同的演员阵容和转换解决方案,但都没有成功。

【问题讨论】:

  • 等等 - 为什么这个标签同时带有 mysql 和 sql server?是哪个?
  • 抱歉我已经修复了标签

标签: sql sql-server-2008 sql-server-2008-r2 sql-update varbinary


【解决方案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 

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

【讨论】:

  • 谢谢你,杰克让我大吃一惊!现在一切都解决了,实际上只需要删除密码上的引号:(
【解决方案2】:

由于您使用的是 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)

【讨论】:

  • 不幸的是还是一样,字符串被改变了,所以我没有在那个字段中得到已知的密码。
  • 只传值0x2B...不用单引号,否则db中的值会不一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 2018-09-14
  • 2021-04-23
  • 2017-11-30
  • 1970-01-01
  • 2017-03-14
相关资源
最近更新 更多