2013-01-14 202 views
2

我有一个SQL函数用于将字符串转换为base64编码的字符串。唯一的问题是UTF8没有被使用,我可以说,因为我有一个单独的C#工具,它提供了不同的输出。Base64在SQL中编码utf8字符串

SQL功能:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER FUNCTION [dbo].[Base64Encode] (@sInput NVARCHAR(max)) 
RETURNS NVARCHAR(max) 
BEGIN 

DECLARE @vInput    VARBINARY(max) 
DECLARE @sEncodedOutput  NVARCHAR(max) 

set @vInput = convert(varbinary(max), @sInput) 
set @sEncodedOutput = cast('' as xml).value('xs:base64Binary(sql:variable("@vInput"))', 'NVARCHAR(max)') 

RETURN @sEncodedOutput 

END 

C#

 try 
     { 
      encodedValueTextbox.Text = Convert.ToBase64String(
       Encoding.UTF8.GetBytes(valueTextbox.Text)); 
     } 
     catch (Exception ex) 
     { 
      encodedValueTextbox.Text = ex.Message; 
     } 

有没有办法让SQL使用UTF8?

+2

虽然我不能满足你的问题,但我想知道你为什么要base64编码UFT-8字符串?你是否试图隐藏文字?如果你想这么做,最好去加密。 – GameScripting

+0

base64给出的'随机文本'看起来就足够了 – LynchDev

+0

@游戏脚本:由于有256个以上的字符代码,所以不能base64编码nvarchar值,所以文本必须编码为字节格式,例如使用UTF-8。 – Guffa

回答

0

您的@sInput是NVARCHAR,它是UNICODE UCS-2。所以,你将UCS-2变成二进制。

您可以将输入参数更改为varbinary,并以二进制形式将UTF-8传递到函数中。如果你的源数据也是来自SQL的nvarchar,你需要继续把这个二进制数据转换回源C#(也许到varbinary的存储点,基本上我不知道你的其余部分系统看起来像)。

另一种方法是在CLR中编写此函数。使用C#将UCS-2转换为UTF-8,然后在那里执行Base64编码。