【问题标题】:Base64 encode a utf8 string in SQLBase64 在 SQL 中编码一个 utf8 字符串
【发布时间】:2012-12-28 11:38:40
【问题描述】:

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

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?

【问题讨论】:

  • 虽然我无法回答您的问题,但我想知道您为什么要对 UFT-8 字符串进行 base64 编码?您是否尝试隐藏文本?如果您愿意,最好使用加密。
  • base64 给出的“随机文本”外观就足够了
  • @GameScripting:您不能对 nvarchar 值进行 base-64 编码,因为有超过 256 个字符代码,因此必须将文本编码为字节格式,例如使用 UTF-8。
  • MSSQL NVarChar 不是 .Net string。 MSSQL VarBinary 不是 .Net byte[]。从NVarCharVarBinary 的TSQL 转换不是对.Net UTF8.GetBytes() 函数的调用。转换为 XML NVarChar 的 TSQL 不是对 .Net Convert.ToBase64String() 的调用。那么,是什么让你认为这些操作应该是等价的?您想使用来自两个平台的函数来回传值吗?
  • @Jodrell:我不确定你的意思是什么?是的,我了解语言之间的数据类型不同,但由于我对 SQL 的熟练程度不如 C#,所以我想问如何让 SQL 产生与 C# 相同的输出。

标签: c# sql string utf-8 base64


【解决方案1】:

您的@sInput 是 NVARCHAR,即 UNICODE UCS-2。因此,您正在将 UCS-2 转换为二进制文件。

您可以将输入参数更改为 varbinary 并将 UTF-8 作为二进制传递给函数。如果您输入函数的源数据也是来自 SQL 的 nvarchar,则您需要继续将二进制数据转换推回源 C#(可能存储为 varbinary,基本上我不知道您的其余部分是什么)系统看起来像)。

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

【讨论】:

    猜你喜欢
    • 2012-03-05
    • 2021-09-22
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 2022-06-19
    • 2018-06-12
    • 2016-05-31
    • 1970-01-01
    相关资源
    最近更新 更多