stc*_*flw 2 sql-server encoding varchar varbinary sql-server-2012
我正在尝试将SQL Server 2012 中的数据库列转换DATA为。varbinary()varchar(max)
我正在使用此代码来处理转换:
\n\nSELECT CONVERT(VARCHAR(MAX), DATA) FROM [dbo].[TABLE_NAME]\nRun Code Online (Sandbox Code Playgroud)\n\n结果行如下:
\n\nVW 6501 \xc3\x83\xe2\x80\xa1ama\xc3\x85\xc5\xb8\xc3\x84\xc2\xb1r\nRun 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\nusing 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}\nRun Code Online (Sandbox Code Playgroud)\n\n将程序集导入数据库并创建外部函数:
\n\nCREATE 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\nRun Code Online (Sandbox Code Playgroud)\n\n最后一步,您必须启用 clr
\n\nsp_configure 'clr enabled',1\nGO\nRECONFIGURE\nGO\nsp_configure 'clr enabled' -- make sure it took\nGO\nRun Code Online (Sandbox Code Playgroud)\n\n瞧\xc3\xa0!
\n\nSELECT dbo.Utf8ToNVarChar(DATA) FROM [dbo].[TABLE_NAME]\nRun Code Online (Sandbox Code Playgroud)\n