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 类型为nchar
和nvarchar
。不要使用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 数据类型