1

理论上varchar(max)varbinary(max)列应该能够存储多达 2GB 的数据,但我不能存储 5000 个字符长的 unicode 字符串。

我查看了有关此主题的其他问题,他们都建议检查列大小。我已经这样做了,并看到所有相关列都声明为最大大小。

与类似问题的主要区别在于,在存储时我正在使用加密数据EncryptByKey,我认为这是我正在寻找的瓶颈。从 MSDN 我知道返回类型的EncryptByKey最大大小为 8000 字节,并且不清楚 @cleartext参数的最大大小是多少,但我怀疑它是相同的。

以下代码给了我错误:

OPEN SYMMETRIC KEY SK1 DECRYPTION BY CERTIFICATE Cert1;

DECLARE @tmp5k AS NVARCHAR(max);
SET @tmp5k = N'...5000 characters...';
SELECT EncryptByKey(Key_GUID('SK1'), @tmp5k);
GO

[22001][8152] 字符串或二进制数据将被截断。

如何加密和存储大字符串(大约 5k Unicode 字符)?

4

1 回答 1

0

所以我在使用 C# 并尝试加密并将长 JSON 字符串插入 SQL 时遇到了这个问题。最终的工作是将纯文本字符串转换为二进制,然后使用相同的 SQL EncryptByKey 函数将其插入。

如果你这样做只是 SQL,我认为你可以使用这个函数:

CONVERT(VARBINARY(MAX), @tmp5k) AS ToBinary

所以使用我们的例子:

OPEN SYMMETRIC KEY SK1 DECRYPTION BY CERTIFICATE Cert1;

DECLARE @tmp5k AS NVARCHAR(max);
SET @tmp5k = N'...5000 characters...';
SELECT EncryptByKey(Key_GUID('SK1'), CONVERT(VARBINARY(MAX), @tmp5k));
GO

下面是使用 SQL 将二进制文件转换回字符串的示例:

CONVERT(VARCHAR(100), CONVERT(VARBINARY(100), @TestString)) AS StringFromBinaryFromString ;
于 2021-03-04T18:53:13.147 回答