TSQL - Base64编码问题 - 文本v / s列

时间:2016-03-20 07:47:46

标签: sql-server encoding base64

在引用问题Base64 encoding in SQL Server 2005 T-SQL之后,我尝试从sql表中获取某些数据的base64值,但与直接文本值相比,它没有给出正确的值。

使用直接文字

SELECT CAST('?' as varbinary) FOR XML PATH(''), BINARY BASE64

将值Pw==设为正确且解码为?

使用数据库条目

SELECT CAST([Col] as varbinary) from tblTable FOR XML PATH(''), BINARY BASE64

[Col]值= ?,输出为PwA=,解码时给出?和一个额外的不可打印的角色。

  

使用len函数检查时的屏幕截图。

enter image description here

这样做的原因是我想使用update语句将少数列的数据从纯文本转换为base64,这只是示例值,而实际值是更大的文本,它也存在这个问题,但每个字符。

编辑:这是从ASP.Net解码时,如果它在标签上,那么它会正确显示,但在文本框中使用时会显示额外的垃圾字符。

1 个答案:

答案 0 :(得分:1)

两件事:

首先,"直接文字"例如:

SELECT CAST('?' as varbinary) FOR XML PATH(''), BINARY BASE64

----
Pw==

将单字节(VARCHAR)字符编码为base 64.

对于NVARCHAR,每个字符类型2个字节,它应该是:

SELECT CAST(N'?' as varbinary) FOR XML PATH(''), BINARY BASE64

----
PwA=

在问题的sceond部分,询问为什么在解码先前编码的NVARCHAR类型列时会产生额外的字符。您实际上将2个字节编码为基数64并将其转换为2个单字节(VARCHAR)字符。

要解码为NVARCHAR,您需要执行此操作:

SELECT CAST(CAST( 'PwA=' as XML ).value('.','varbinary(max)') AS NVARCHAR(250) )

---
?