1

理論上varchar(max)varbinary(max)列には最大 2 GB のデータを格納できるはずですが、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 に答える