Как обновить поле varbinary определенным значением? - PullRequest
15 голосов
/ 20 декабря 2011

В основном я пытаюсь дать пользователю определенный пароль, чтобы я мог проверить некоторые функции в системе, поскольку у меня есть только наша учетная запись администратора, и я не могу играть с этим, я просто выбираю случайную учетную запись, чтобы я мог сделатьмое тестированиеИтак, вот моя попытка обновления:

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

Он работает нормально, однако код в базе данных выглядит японским для одного, а синтаксис для другого выглядит нормально, но это не то значение, которое я вставляю,Я хочу использовать точное введенное мной значение, чтобы я мог войти в систему. Как мне это сделать?Я безуспешно пробовал несколько разных решений приведения и преобразования.

Ответы [ 2 ]

33 голосов
/ 20 декабря 2011

Попробуйте это:

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 голосов
/ 20 декабря 2011

Поскольку вы используете 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)

...