我有一个varbinary(max)列,其中包含压缩的UTF-8编码文本。我想要解压这些数据并在T-SQL中使用SQL Server的UTF-8功能将其转换为varchar(max)。
我正在寻找一种在从varbinary(max)转换为varchar(max)时指定编码的方法。我唯一成功的办法是创建一个表变量,其中包含一个具有UTF-8排序规则的列,并将varbinary数据插入其中。
DECLARE @rv TABLE(
Res varchar(max) COLLATE Latin1_General_100_CI_AS_SC_UTF8
)
INSERT INTO @rv
SELECT SUBSTRING(Decompressed, 4, DATALENGTH(Decompressed) - 3) WithoutBOM
FROM
(SELECT DECOMPRESS(RawResource) AS Decompressed FROM Resource) t
我在想是否有更优雅和高效的方法,不需要插入到表变量中。
更新:
将其简化为一个不涉及字节顺序标记或压缩的简单示例:
我有字符串“Hello”,使用UTF-8编码,没有BOM存储在变量@utf8Binary中。
DECLARE @utf8Binary varbinary(max) = 0x48656C6C6F20F09F988A
现在我尝试将其赋值给不同的基于字符的变量并打印结果:
DECLARE @brokenVarChar varchar(max) = CONVERT(varchar(max), @utf8Binary)
print '@brokenVarChar = ' + @brokenVarChar
DECLARE @brokenNVarChar nvarchar(max) = CONVERT(varchar(max), @utf8Binary)
print '@brokenNVarChar = ' + @brokenNVarChar
DECLARE @rv TABLE(
Res varchar(max) COLLATE Latin1_General_100_CI_AS_SC_UTF8
)
INSERT INTO @rv
select @utf8Binary
DECLARE @working nvarchar(max)
Select TOP 1 @working = Res from @rv
print '@working = ' + @working
这将产生以下结果:
@brokenVarChar = Hello 😊
@brokenNVarChar = Hello 😊
@working = Hello
我能使用这种间接的方法正确地解码二进制结果,但我想知道是否有更直接(可能更有效)的方法。
CAST(@utf8Binary AS varchar(max)) COLLATE Latin1_General_100_CI_AS_SC_UTF8
应该 能够工作,但实际上却没有。 - Heinzi