【问题标题】:Character Problem When Converting image Data Type to String in Sql ServerSql 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,除非您可以确保文本与排序规则匹配。

标签: sql sql-server database tsql


【解决方案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 解决方案是成功的。
猜你喜欢
  • 1970-01-01
  • 2021-12-30
  • 2020-03-17
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多