在理论中,varchar(max)
和varbinary(max)
列应该能够存储多达2GB的数据,但我无法存储Unicode字符串5000个字符。
我已经查看了有关此主题的其他问题,他们都建议检查列大小。我已经完成了此操作,并看到所有相关的列均以最大大小声明。
与类似问题的关键区别在于,当存储我使用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字符(?
因此,我在使用C#并尝试加密和插入一个长JSON字符串时遇到了这个问题。最终工作的是将普通文本字符串转换为二进制,然后使用相同的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 ;