如何在 SQL Server 2012 中将 varbinary() 转换为 varchar(max) 时对语言特定的字符进行编码?

stc*_*flw 2 sql-server encoding varchar varbinary sql-server-2012

我正在尝试将SQL Server 2012 中的数据库列转换DATA为。varbinary()varchar(max)

\n\n

我正在使用此代码来处理转换:

\n\n
SELECT CONVERT(VARCHAR(MAX), DATA) FROM [dbo].[TABLE_NAME]\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果行如下:

\n\n
VW 6501 \xc3\x83\xe2\x80\xa1ama\xc3\x85\xc5\xb8\xc3\x84\xc2\xb1r\n
Run Code Online (Sandbox Code Playgroud)\n\n

我在处理语言特定字符时遇到问题(目前我的情况是土耳其语)

\n\n

如何解决 SQL Server 2012 中的此编码问题?

\n\n

考虑到任何给定语言的数据丢失/编码问题,是否有一种通用方法可以对任何语言进行这种转换?

\n\n

这可能听起来像是一个新手问题,但我真的很感激任何建议或答案。

\n\n

谢谢你,

\n

小智 5

一般来说,SQL Server 并不重视 UTF-8。\n但是,.NET 有方法可以做到这一点,您可以通过 CLR 集成来获取它们。

\n\n

使用 C# 编译:

\n\n
using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nusing System.Data.SqlTypes;\nusing Microsoft.SqlServer.Server;\n\nnamespace UtfLib\n{\n    public static class UtfMethods\n    {\n        [SqlFunction(IsDeterministic = true, IsPrecise = true)]\n        public static SqlBinary NVarCharToUtf8(SqlString inputText)\n        {\n            if (inputText.IsNull)\n                return new SqlBinary(); // (null)\n\n            return new SqlBinary(Encoding.UTF8.GetBytes(inputText.Value));\n        }\n\n        [SqlFunction(IsDeterministic = true, IsPrecise = true)]\n        public static SqlString Utf8ToNVarChar(SqlBinary inputBytes)\n        {\n            if (inputBytes.IsNull)\n                return new SqlString(); // (null)\n\n            return new SqlString(Encoding.UTF8.GetString(inputBytes.Value));\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

将程序集导入数据库并创建外部函数:

\n\n
CREATE ASSEMBLY UtfLib\nFROM 'C:\\UtfLib.dll'\nGO\nCREATE FUNCTION NVarCharToUtf8 (@InputText NVARCHAR(MAX))\nRETURNS VARBINARY(MAX)\nAS EXTERNAL NAME UtfLib.[UtfLib.UtfMethods].NVarCharToUtf8\nGO\nCREATE FUNCTION Utf8ToNVarChar (@InputBytes VARBINARY(MAX))\nRETURNS NVARCHAR(MAX)\nAS EXTERNAL NAME UtfLib.[UtfLib.UtfMethods].Utf8ToNVarChar\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后一步,您必须启用 clr

\n\n
sp_configure 'clr enabled',1\nGO\nRECONFIGURE\nGO\nsp_configure 'clr enabled'  -- make sure it took\nGO\n
Run Code Online (Sandbox Code Playgroud)\n\n

瞧\xc3\xa0!

\n\n
SELECT dbo.Utf8ToNVarChar(DATA) FROM [dbo].[TABLE_NAME]\n
Run Code Online (Sandbox Code Playgroud)\n