Userpasswordフィールドのデータ型がvarbinaryであるテーブルがあるので、varcharデータを保存するとエラーが発生するため、どの形式のデータをuserpasswordフィールドに保存すればよいか混乱します。
varbinary
列には何でも格納できます。文字列をそこに格納するには、varbinary
にキャストする必要があります。
declare @t table (id int identity, pwd varbinary(50))
insert into @t (pwd) values (cast('secret' as varbinary(50)))
ただし、パスワードの場合、varbinary
列には通常、何らかのハッシュが格納されます。たとえば、 HashBytes
function を使用したSHA1ハッシュ:
insert into @t (pwd) values (HashBytes('sha1', 'secret'));
実際のパスワードの代わりに一方向ハッシュを保存する方が安全です。パスワードが一致するかどうかを確認できます。
select * from @t where pwd = HashBytes('sha1', 'secret')
しかし、表を見てパスワードを取得する方法はありません。したがって、エンドユーザーだけが自分のパスワードを知っており、DBAでさえもそれを取得することはできません。
VARCHARを明示的にキャストする必要があります。
SELECT CAST(N'Test' as VARBINARY)
SQL Serverのエラーメッセージは言う。
データ型varcharからvarbinaryへの暗黙的な変換は許可されていません。
SQL Serverは、MSDNのCASTおよびCONVERTの大きなテーブルに従って、 varcharからvarbinary への明示的な変換を必要とします
テーブルには、ハッシュ値を格納するvarbinary列があります sys.sql_logins
SELECT CAST(N'Test' as VARBINARY)
------サイズを指定する必要があります---------->
SELECT CAST(N'Test' as VARBINARY(30))