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

Posted

技术标签:

【中文标题】Sql Server中将图像数据类型转换为字符串时出现的字符问题【英文标题】:Character Problem When Converting image Data Type to String in Sql Server 【发布时间】:2018-11-30 06:47:15 【问题描述】:

我正在运行这样的查询:

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

IDAT 列类型为“图像”,查询执行成功,但某些土耳其语字符是 'çaÄŸdaÅŸ' 像这样。它应该是“çağdaş”。 我试过这个:

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

什么都没有改变。有人对这种情况有想法吗?

【问题讨论】:

'çaÄŸdaÅŸ' 是 9 个符号,而 'çağdaş' 只有 6 个。IDAT 中数据的大小是多少? Post 是十六进制值。你知道那里存储的数据使用的编码吗? 值铸造VARCHAR之前:0x68C3BC736579696E20616C692076656C69206E6F746C617220C59F65726D696E2061C49F72C4B120C3B66BC3BC7A20C3A761C49F6461C59F我不知道使用该数据进行编码跨度> SQL Server 已经支持 Unicode。 不要将文本存储为二进制,你不需要它 Unicode 类型为ncharnvarchar。不要使用varchar,除非您可以确保文本与排序规则匹配。 【参考方案1】:

这个二进制值0x68C3BC736579696E20616C692076656C69206E6F746C617220C59F65726D696E2061C49F72C4B120C3B66BC3BC7A20C3A761C49F6461C59F 是UTF-8 编码的,转换为文本是hüseyin ali veli notlar şermin ağrı öküz çağdaş。不幸的是,SQL Server 直到 2019 年才支持 UTF-8,所以你必须自己解码。这个question 解释了如何做到这一点。

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

【讨论】:

这个问题的答案真的很糟糕。一个简单的 SQLCLR UDF 只需一次调用 Encoding.UTF8.GetString(inputBytes.Value) 会更快,而且更可能是正确的。 This question 显示相反的情况,从字符串生成 UTF8 字节。 是的,如果 CLR 是一个选项,那将是更好的选择。但是,应用程序的更改会更好。如果此文本必须在数据库中以 UTF-8 格式提供(为什么?!)并转换为数据库中的文本(再次,为什么?),那么应用程序可以简单地将其存储两次 :) 实际上,我唯一感兴趣的是将这种数据类型转换为正确的字符串。在这种情况下,@AndreyNikolov 解决方案是成功的。

以上是关于Sql Server中将图像数据类型转换为字符串时出现的字符问题的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2008 中将 NVARCHAR 转换为 INT 数据类型

如何在 SQL Server 中将字符串转换为日期时间?

在 SQL Server 中将数据转换为 XML 时出错

在sql server数据库中将一个nvarchar类型的空值转换成decimal(18,3)类型

在 SQL Server 中将字符串转换为日期

sql server 中怎么把字符串转化为日期?