You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EncryptByKey加密字符串丢失问题求助:超过26位仅加密前26位

解决EncryptByKey截断长字符串的问题

这问题我之前排查过好几次,核心原因就是数据类型的隐式长度限制在搞事情!你现在遇到的超过26位只加密前26位的情况,大概率是以下两个环节出了问题:

问题根源分析

  • 变量声明长度不足:如果你的@AccountName是用DECLARE @AccountName nvarchar;或者DECLARE @AccountName nvarchar(26);声明的,那超过长度的部分会直接被截断,加密自然只能处理前26位。
  • 加密时的隐式转换截断:SQL Server中,当你使用CAST但不指定长度时,默认会使用nvarchar(30)(不同场景可能有差异),如果你的字符串超过这个长度,也会被截断。

具体解决方案

1. 修正变量声明

首先确保@AccountName的长度足够覆盖你的业务场景,直接用nvarchar(MAX)是最稳妥的(或者根据实际需求设置比如nvarchar(500)):

DECLARE @AccountName nvarchar(MAX);

2. 加密时显式指定足够长度

在加密表达式里,强制把处理后的字符串转换为nvarchar(MAX),避免隐式截断:

AccountName = EncryptByKey(
    Key_GUID('SKEDB_BenName_11'),
    CAST(UPPER(LTRIM(RTRIM(@AccountName))) AS nvarchar(MAX))
)

3. 验证目标字段类型

最后别忘了检查存储加密后数据的AccountName字段,必须是varbinary(MAX)类型——因为EncryptByKey返回的加密数据长度会随输入字符串变长而增加,固定长度的varbinary会截断加密结果,导致解密后数据不完整。

测试验证

你可以用一个超过26位的测试字符串来验证:

DECLARE @TestAccountName nvarchar(MAX) = 'ThisIsAVeryLongAccountNameThatIsOver26Characters';
SELECT 
    EncryptByKey(Key_GUID('SKEDB_BenName_11'), CAST(UPPER(LTRIM(RTRIM(@TestAccountName))) AS nvarchar(MAX))) AS EncryptedValue,
    DecryptByKey(EncryptByKey(Key_GUID('SKEDB_BenName_11'), CAST(UPPER(LTRIM(RTRIM(@TestAccountName))) AS nvarchar(MAX)))) AS DecryptedValue;

如果解密后能完整还原测试字符串,就说明问题解决了。

内容的提问来源于stack exchange,提问作者Ritesh Gore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:29:06