MS SQL 服务器 EncryptByKey - 字符串或二进制数据将被截断
MS SQL Server EncryptByKey - String or binary data would be truncated
理论上 varchar(max)
和 varbinary(max)
列应该能够存储多达 2GB 的数据,但我不能存储 5000 个字符长的 unicode 字符串。
我查看了有关此主题的其他问题,他们都建议检查列大小。我这样做了,看到所有相关列都声明了最大大小。
与类似问题的主要区别在于,存储时我使用 EncryptByKey
加密数据,我认为这是我正在寻找的瓶颈。从 MSDN 我知道 return 类型的 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] String or binary data would be truncated.
如何加密和存储大字符串(大约 5k unicode 字符)?
所以我 运行 在使用 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 ;
理论上 varchar(max)
和 varbinary(max)
列应该能够存储多达 2GB 的数据,但我不能存储 5000 个字符长的 unicode 字符串。
我查看了有关此主题的其他问题,他们都建议检查列大小。我这样做了,看到所有相关列都声明了最大大小。
与类似问题的主要区别在于,存储时我使用 EncryptByKey
加密数据,我认为这是我正在寻找的瓶颈。从 MSDN 我知道 return 类型的 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] String or binary data would be truncated.
如何加密和存储大字符串(大约 5k unicode 字符)?
所以我 运行 在使用 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 ;