基本的に、システムの機能をテストできるように、ユーザーに特定のパスワードを与えようとしています。管理者アカウントしか持っていないので、それを使って遊ぶことはできません。テストを行えるように、ランダムなアカウントを選択しているだけです。そこで、更新を試みました。
UPDATE dbo.Login
SET
Salt=CAST('bPftidzyAQik' AS VARBINARY),
Password=CAST('0x2B89C2954E18E15759545A421D243E251784FA009E46F7A163926247FDB945F85F095DBB1FFF5B2B43A6ADAE27B8C46E176902412C4F8943E39528FF94E0DD5B' AS VARBINARY)
WHERE LoginID=10947
正常に動作しますが、データベースのコードは 1 つは日本語に見え、もう 1 つは構文に問題がないように見えますが、入力した値ではありません。サインインできるように、入力した正確な値を使用したいです。どうすればいいですか? いくつかの異なるキャストおよび変換ソリューションを試しましたが、うまくいきませんでした。
ベストアンサー1
これを試して:
UPDATE dbo.Login
SET
Salt=CAST('bPftidzyAQik' AS VARBINARY),
Password=0x2B89C2954E18E15759545A421D243E251784FA009E46F7A163926247FDB945F85F095DBB1FFF5B2B43A6ADAE27B8C46E176902412C4F8943E39528FF94E0DD5B
WHERE LoginID=10947
(16 進数値を格納する文字列を varbinary にキャストする必要はありません。引用符なしでデフォルトでそのままになっています)
問題は、パスワードの 16 進値をどのように生成しているか、そしてそれを生成するのに、それを読み取るのと同じエンコードを使用しているかどうかです。そのデータを文字列に戻す予定の場合は、そのためのコードが必要になります。これを実行する関数を次に示します。
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 値を返します。頑張ってください!