在Sql Server中将图像数据类型转换为字符串时出现字符问题

在Sql Server中将图像数据类型转换为字符串时出现字符问题,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,我运行的查询如下: SELECT CAST(CAST(IDAT as varbinary(max)) as varchar(max)) IDAT列类型是“image”,查询执行成功,但一些土耳其字符是这样的“çaÄŸdaŸ”。它应该是“çağdaş”。 我试过这个: SELECT CAST(CAST(IDAT as varbinary(max)) as varchar(max)) COLLATE Turkish_CI_AS 没有什么变化。有人知道这种情况吗?这个二进制值0x68C3BC7

我运行的查询如下:

SELECT CAST(CAST(IDAT as varbinary(max)) as varchar(max)) 
IDAT列类型是“image”,查询执行成功,但一些土耳其字符是这样的“çaÄŸdaŸ”。它应该是“çağdaş”。 我试过这个:

SELECT CAST(CAST(IDAT as varbinary(max)) as varchar(max)) COLLATE Turkish_CI_AS

没有什么变化。有人知道这种情况吗?

这个二进制值
0x68C3BC736579696E20616C692076656C69206E6F746C61720C59F65726D696E2061C49F72C4B120C3B66BC7A20C3A761C49F6461C59F
是UTF-8编码的,转换成文本的是
hüseyin ali veli notlarşermin ağrğkğzğda
。不幸的是,SQL Server直到2019年才支持UTF-8,所以您必须自己解码它。这说明了如何做


如果您可以更改应用程序并将值存储在UTF-16中,则可以将其直接转换为
NVARCHAR
(或仅将数据存储为文本)。

“aÄaŸdaŸ”是9个符号,而“aŸdaş”只有6个符号。IDAT中的数据大小是多少?Post是十六进制值。您知道存储在那里的数据使用的编码吗?强制转换varchar之前的值:0x68C3BC736579696E20616C692076656C69206E6F746C617220C59F65726D696E2061C49F72C4B120C3B66BC3BC7A20C3A761C49F6461C59F我不知道此数据使用的编码。SQL Server已经支持Unicode。不要将文本存储为二进制,您不需要它。Unicode类型是
nchar
nvarchar
。除非可以确保文本与排序规则匹配,否则不要使用
varchar
。这个问题的答案非常糟糕。一个简单的SQLCLR UDF,只需一次调用
Encoding.UTF8.GetString(inputBytes.Value)
就可以更快、更可能正确。相反,从字符串生成UTF8字节。是的,如果CLR是一个选项,它将是更好的选项。但是,应用程序中的更改会更好。如果此文本必须在数据库中以UTF-8的形式提供(为什么?!),并在数据库中转换为文本(同样,为什么?),那么应用程序可以简单地将其存储两次:)实际上,我唯一感兴趣的是将此数据类型转换为正确的字符串。在这种情况下,@AndreyNikolov解决方案是成功的。