9

Fondamentalmente sto cercando di dare a un utente una certa password in modo da poter testare alcune funzionalità su un sistema, in quanto ho solo il nostro account admin e non posso giocare con questo sto solo selezionando un account casuale in modo da poter fare il mio test. Così qui è il mio tentativo di un aggiornamento:Come aggiornare un campo varbinary con un valore specifico?

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

funziona benissimo tuttavia il codice nel database guarda giapponese per uno e la sintassi per l'altro guarda bene, ma non è il valore che sto mettendo in, voglio per usare il valore esatto che ho inserito così posso accedere. Come faccio a fare questo? Ho provato diversi cast e convertito soluzioni senza fortuna.

+0

Wait - perché questo etichettato sia con MySQL e SQL server? Cos'è questo? –

+0

Mi scuso, ho corretto i tag ora – shicky

risposta

25

Prova questo:

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

(non c'è bisogno di lanciare una stringa la memorizzazione di un valore esadecimale in varbinary - è proprio quello che lo è di default, senza le virgolette)

La domanda è: , come stai generando quel valore esadecimale della password e stai usando la stessa codifica per generarlo mentre lo stai leggendo? Se stai pensando di riconvertire i dati in una stringa, avrai bisogno di un codice per farlo. Ecco una funzione che ho scritto che fa questo:

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 

non so quanto utile questo sarà per voi, però, dal momento che è molto probabile che tutto ciò che app sta utilizzando questi campi sta gestendo i valori in modo diverso rispetto questa funzione si aspetta. Per la cronaca, questa funzione prende un valore varbinary che era in origine una stringa utf-8 e restituisce il valore varchar di quella stringa. In bocca al lupo!

+0

Grazie a jake che stava facendo la mia testa! Tutto risolto ora, letteralmente solo bisogno di rimuovere le virgolette sulla password :( – shicky

2

Dal momento che si sta utilizzando 2008, provate questo:

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)

+0

Sfortunatamente ancora lo stesso, la stringa è cambiata quindi non sto ottenendo la password conosciuta in quel campo. – shicky