我有一个表,其中userpassword字段有varbinary数据类型,所以我很困惑,我应该以哪种形式将数据保存到userpassword字段,因为当我保存varchar数据时,它给了我错误。
答案 0 :(得分:25)
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也无法检索密码。
答案 1 :(得分:1)
您需要显式转换VARCHAR。
SELECT CAST(N'Test' as VARBINARY)
SQL Server错误消息说。
从数据类型varchar到varbinary的隐式转换不是 允许的。
答案 2 :(得分:1)
根据CAST上的大表和MSDN中的CONVERT,SQL Server需要从varchar to varbinary进行显式转换
该表将有一个varbinary列,用于存储根据sys.sql_logins
的散列值答案 3 :(得分:0)
SELECT CAST(N'Test' as VARBINARY)
------您必须给它一个大小---------->
SELECT CAST(N'Test' as VARBINARY(30))