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

我试图在sql Server 2012中将数据库列DATA从varbinary()转换为varchar(max).

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

SELECT CONVERT(VARCHAR(MAX),DATA) FROM [dbo].[TABLE_NAME]

结果行如下:

VW 6501 Çamaşır

我在语言特定字符方面遇到麻烦(目前我的语言是土耳其语)

如何在sql Server 2012中克服此编码问题?

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

这可能听起来像一个菜鸟问题,但我真的很感激任何建议或答案.

谢谢,

解决方法

通常,sql Server不会高度重视UTF-8.
但是,.NET有方法可以做到这一点,你可以通过CLR集成来实现它们.

使用C#编译它:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Data.sqlTypes;
using Microsoft.sqlServer.Server;

namespace UtfLib
{
    public static class UtfMethods
    {
        [sqlFunction(IsDeterministic = true,IsPrecise = true)]
        public static sqlBinary NVarCharToUtf8(sqlString inputText)
        {
            if (inputText.IsNull)
                return new sqlBinary(); // (null)

            return new sqlBinary(Encoding.UTF8.GetBytes(inputText.Value));
        }

        [sqlFunction(IsDeterministic = true,IsPrecise = true)]
        public static sqlString Utf8ToNVarChar(sqlBinary inputBytes)
        {
            if (inputBytes.IsNull)
                return new sqlString(); // (null)

            return new sqlString(Encoding.UTF8.GetString(inputBytes.Value));
        }
    }
}

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

CREATE ASSEMBLY UtfLib
FROM 'C:\UtfLib.dll'
GO
CREATE FUNCTION NVarCharToUtf8 (@InputText NVARCHAR(MAX))
RETURNS VARBINARY(MAX)
AS EXTERNAL NAME UtfLib.[UtfLib.UtfMethods].NVarCharToUtf8
GO
CREATE FUNCTION Utf8ToNVarChar (@InputBytes VARBINARY(MAX))
RETURNS NVARCHAR(MAX)
AS EXTERNAL NAME UtfLib.[UtfLib.UtfMethods].Utf8ToNVarChar

最后一步,您必须启用clr

sp_configure 'clr enabled',1
GO
RECONfigURE
GO
sp_configure 'clr enabled'  -- make sure it took
GO

瞧!

SELECT dbo.Utf8ToNVarChar(DATA) FROM [dbo].[TABLE_NAME]

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...