如何用T-SQL生成符合标准的字符串Base64编码?
解决T-SQL字符串转Base64与UTF-8标准不一致的问题
问题根源
你遇到的编码差异,是因为T-SQL中直接CAST('ABCD' AS varbinary)时,使用了数据库默认的非UTF-8字符编码(通常是SQL Server默认的Latin1或UTF-16编码),而你期望的是基于UTF-8编码的Base64结果。比如ABCD被转成UTF-16时,每个字符占2字节(0x4100, 0x4200, 0x4300, 0x4400),生成的Base64串QQBCAEMARAA=解码后自然出现乱码。
正确实现方案
要生成符合UTF-8标准的Base64编码,需要先将字符串转换为UTF-8编码的二进制数据,再执行Base64转换,以下是两种可行方法:
方法1:使用CONVERT指定UTF-8编码(推荐,兼容SQL Server 2016+)
SELECT CONVERT(VARCHAR(MAX), 'ABCD', 65001) FOR XML PATH(''), BINARY BASE64;
执行结果为QUJDRA==,这是ABCD基于UTF-8编码的标准Base64串。
方法2:SQL Server 2019+专属写法
利用UTF-8排序规则直接转换:
SELECT CAST(CAST('ABCD' AS VARCHAR(MAX)) COLLATE Latin1_General_100_CI_AS_SC_UTF8 AS VARBINARY(MAX)) FOR XML PATH(''), BINARY BASE64;
匹配目标网站结果的补充
你提到的目标网站结果QUJDRAo=,是因为编码时额外包含了换行符(\n)。如果需要完全匹配,只需在字符串末尾添加换行符即可:
SELECT CONVERT(VARCHAR(MAX), 'ABCD' + CHAR(10), 65001) FOR XML PATH(''), BINARY BASE64;
执行后将得到QUJDRAo=,与目标网站结果完全一致。
解码验证
用你的C#代码解码生成的Base64串:
Encoding.UTF8.GetString(Convert.FromBase64String("QUJDRA=="))
将正确返回ABCD,符合预期。
内容的提问来源于stack exchange,提问作者kaito kumon
相关产品推荐
相关产品推荐

