将VARBINARY存储在VARCHAR列中

问题描述 投票:2回答:3

请仔细阅读以下代码:

DECLARE @EncryptedPassword VARBINARY(8000) = ENCRYPTBYPASSPHRASE('ABCD','password')
DECLARE @Setting AS TABLE (ID INT, Value VARCHAR(MAX))

INSERT INTO @Setting VALUES (1, 'true')
INSERT INTO @Setting VALUES (2, @EncryptedPassword)

SELECT * FROM @Setting

@Setting表可以包含具有多种数据类型的数据。正如我所看到的,它存储了价值。但无法使用SELECT命令检索它。我怎样才能做到这一点?

sql-server varbinary
3个回答
1
投票

正如我在评论中所说的那样,我强烈建议您转动设置表并停止输入所有内容:

DECLARE @EncryptedPassword VARBINARY(8000) = ENCRYPTBYPASSPHRASE('ABCD','password')
DECLARE @Setting AS TABLE (
    Lock char(1) not null default 'X' primary key check (Lock='X'),
    SomethingBoolean bit not null,
    Password varbinary(8000) not null)

INSERT INTO @Setting (SomethingBoolean, Password) VALUES
(1,@EncryptedPassword)

SELECT * FROM @Setting

结果:

Lock SomethingBoolean Password
---- ---------------- -----------------------------------------------------------------------------------------------------------
X    1                0x02000000588C2EB2C67DED10B7828C05500008DB1B1E53EFF63168EC607CA80CA2A1147B75F0A9D50F6B95C810D6DCED37AE8186

这意味着实际使用正确的数据类型存储设置。我们不仅可以依靠类型和空值检查来确保设置正确,我们还可以根据个别设置的需要应用单独的CHECK约束。

Lock就是为了确保此表仅包含1行)


0
投票

尝试更改表结构,同时检索DECRYPT值尝试转换为Varbinary列Nvarchar.ENCRYPTBYPASSPHRASE或DECRYPTBYPASSPHRASE需要2个或更多参数才能给出结果

DECLARE @Setting AS TABLE (ID INT,Value VARBINARY(8000))

INSERT INTO @Setting 
SELECT 1,ENCRYPTBYPASSPHRASE('password',N'ABCD')

SELECT * FROM @Setting
SELECT CONVERT(NVARCHAR(4000),DECRYPTBYPASSPHRASE('password',Value)) FROM @Setting

0
投票

您只需添加加密标志:

DECLARE @EncryptPhrase NVARCHAR(100) = 'ABCD'

DECLARE @Setting AS TABLE (ID INT, Value NVARCHAR(MAX), IsEncrypted BIT)

INSERT INTO @Setting VALUES (1, 'true',  0)
INSERT INTO @Setting VALUES (2, ENCRYPTBYPASSPHRASE(@EncryptPhrase,N'password'), 1)

SELECT * FROM @Setting

SELECT 
ID
,CASE 
    WHEN IsEncrypted = 1 THEN CAST(DecryptByPassPhrase(@EncryptPhrase, CAST(Value AS VARBINARY(MAX))) as NVARCHAR(MAX)) 
    ELSE Value 
END
FROM @Setting
© www.soinside.com 2019 - 2024. All rights reserved.