我有两个功能。加密功能和解密功能(见下文)。解密功能在100%的时间内不能使用特定的单词,我无法弄清楚原因。有人可以帮我解决这个问题吗?在函数到位后,我使用以下select语句测试这两个函数。
select [dbo].[ufn_EncryptString]('Test1') --This string works
select [dbo].[ufn_DecryptString]('Ôæõ÷µ')
select [dbo].[ufn_EncryptString]('diaz-mayo') --This string doesn't work
select [dbo].[ufn_DecryptString]('äêãý±òçĀ÷')
你会认为它与“ - ”有关,但有些实例只是一个没有空格或特殊字符的普通名称,并且该字符串无法解密。
请参阅以下功能:
CREATE FUNCTION [dbo].[ufn_EncryptString] ( @pClearString VARCHAR(100) )
RETURNS NVARCHAR(100) AS
BEGIN
DECLARE @vEncryptedString NVARCHAR(100)
DECLARE @vIdx INT
DECLARE
@vBaseIncrement INT
SET @vIdx = 1
SET @vBaseIncrement = 128
SET @vEncryptedString = ''
WHILE @vIdx <= LEN(@pClearString)
BEGIN
SET @vEncryptedString = @vEncryptedString +
NCHAR(ASCII(SUBSTRING(@pClearString, @vIdx, 1)) +
@vBaseIncrement + @vIdx - 1)
SET @vIdx = @vIdx + 1
END
RETURN @vEncryptedString
END
GO
CREATE FUNCTION [dbo].[ufn_DecryptString] ( @pEncryptedString NVARCHAR(100) )
RETURNS VARCHAR(100) AS
BEGIN
DECLARE @vClearString VARCHAR(100)
DECLARE @vIdx INT
DECLARE @vBaseIncrement INT
SET @vIdx = 1
SET @vBaseIncrement = 128
SET @vClearString = ''
WHILE @vIdx <= LEN(@pEncryptedString)
BEGIN
SET @vClearString = @vClearString +
CHAR(UNICODE(SUBSTRING(@pEncryptedString, @vIdx, 1)) -
@vBaseIncrement - @vIdx + 1)
SET @vIdx = @vIdx + 1
END
RETURN @vClearString
END
GO
答案 0 :(得分:4)
我认为你的功能很好,你的例子就是问题。
select [dbo].[ufn_DecryptString]('äêãý±òçĀ÷')
不起作用......但是以下工作正常:
select [dbo].[ufn_DecryptString](N'äêãý±òçĀ÷')
注意字符串文字的前导N
?由于您的输入参数实际上是UNICODE字符串,因此您需要在文字前加N
,以防止它被强制转换为ASCII字符串...
来自MSDN:
使用前导N:N'A Unicode字符串'。
指定Unicode常量
否则,当它转换为ASCII时,您实际上是在传递äêãý±òçA÷
...只有Ā
字符未在CHAR
字面值中表示,这就是为什么你的问题是断断续续的。