2

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

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

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

结果行如下:

VW 6501 Çamaşır

我在使用特定语言字符时遇到问题(目前就我而言,语言是土耳其语)

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

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

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

谢谢,

4

2 回答 2

4

通常,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]
于 2012-12-26T13:11:23.773 回答
1

尝试 NVARCHAR

Select convert (NVARCHAR(max),DATA) FROM  [dbo].[TABLE_NAME]

编辑:

SQL Server 不支持处理 UTF8。要转换二进制值,您必须编写自己的函数。最简单的方法是使用 CLR。

您可以将其用作模型: 如何在 CLR UDF 中返回 nvarchar(max)?

只需将正则表达式代码替换为 Encoding.UTF8.GetString

于 2012-12-26T09:22:47.583 回答