2013-01-14 206 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編碼。