如何使 SQLCLR 存储过程中的 SqlContext.Pipe.Send 使用 unicode?

How to make SqlContext.Pipe.Send in SQLCLR stored proc work with unicode?

我在 SQL CLR 与 unicode(希伯来文和俄文文本)集成时遇到问题。作为测试,我使用以下 CLR 存储过程在 Visual Studio 中创建了一个简单的数据库项目:

[Microsoft.SqlServer.Server.SqlProcedure]
public static void TestProc ()
{
    //Console.OutputEncoding = System.Text.Encoding.Unicode;
    Trace.WriteLine("Unicode test: blip");
    Trace.WriteLine("Unicode test: בליפ");
    Trace.WriteLine("Unicode test: Блип");
    SqlContext.Pipe.Send("Unicode test: blip");
    SqlContext.Pipe.Send("Unicode test: בליפ");
    SqlContext.Pipe.Send("Unicode test: Блип");
}

发布到测试数据库并在 SQL 服务器中执行存储过程:

EXEC dbo.TestProc;

跟踪输出和 SQL 服务器消息都将非英文字符替换为“????”。

我认为 SQL 服务器和 C# 都可以使用 unicode。在 Windows Forms 项目中使用 unicode,例如将非英语文本添加到文本框,效果很好。

我该如何解决这个问题?是否缺少某些设置?

此问题涉及以下内容:How to pass nvarchar (non-English) to CLR (C#) stored procedure?

我猜测在进行此测试时,您从未关闭并重新打开包含 .cs 文件的选项卡。那是对的吗?您会看到,Visual Studio 不会在编辑器中编译代码,它会编译保存在您当前可能正在编辑的文件中的代码。这些通常是 100% 相同的,但是当涉及到基于 127 以上的值的 "characters" 时,代码页/编码就变得很重要。需要明确的是,我们谈论的是 C# 文件的编码/代码页,不是数据库的

问题是默认编码是 "Windows 1252",至少在我的系统上,而且我怀疑在美国的大多数系统上是这样。所以发生的事情是,当您将此代码编译到程序集中时,编辑器中的内容将保存到磁盘中。但是文件编码不支持这些字符,因此它们在 C# 文件中变成 ? !是的,编译的代码 不是您在屏幕上看到的 。但是如果您关闭 .cs 文件并重新打开它,您就会看到它。希伯来语和俄语文本都是 ?s。这就是 SQL 服务器被要求打印的内容。

要解决此问题,只需转到 文件 菜单,select 高级保存选项... 并在Encoding、select 的顶部下拉列表:

  • Unicode(带签名的 UTF-8)- 代码页 65001

    或:

  • Unicode - 代码页 1200 [这个应该保存为 UTF-16 Little Endian]

? 替换为预期的希伯来语和俄语字符。现在您可以构建和发布并让这些字符按预期显示。