gpt4 book ai didi

sql-server - C# 和 SQL Server 对于字符串是否有效 Base64 存在分歧 - 哪个是正确的?

转载 作者:行者123 更新时间:2023-12-03 03:48:32 24 4
gpt4 key购买 nike

我们在 SQL Server 2008 R2 (SP1) 数据库上有下表:

-- irrelevant columns omitted
create table Person
( PersonID int,
Portrait varchar(max) )

Person.Portrait 列包含从 JPG 图像编码的 Base64 字符串 - 这是由我们无法控制的第三方系统填充的。我需要将此数据转换回原始字节,以便可以在报告中显示它:

select isnull(cast(N'' as xml).value('xs:base64Binary(sql:column("psn.Portrait"))', 'varbinary(max)'), 0xdeadbeef) as [Portrait]
from Person psn with (nolock)
where psn.PersonID = <n>

对于某些行,它返回有效的 varbinary 数据,对于其他行,它返回 OxDEADBEEF(换句话说,XML 表达式的结果返回 null)。

但是,如果我对 Person 表中在 SQL Server 中返回 null 的行运行以下 C# 代码,我将获得有效的 JPG 图像输出:

var portraitBytes = Convert.FromBase64String(Sql.SelectSingleString(
@"select psn.Portrait
from Person psn with (nolock)
where psn.PersonID = <n>"));

using (var writer = new FileStream(@"C:\portrait.jpg", FileMode.CreateNew))
{
writer.Write(portraitBytes, 0, portraitBytes.Length);
}

我能看到 SQL Server 视为“有效”的值与“无效”值之间的唯一区别是“无效”值以字符 Z 结尾。如果我用 = 替换这个字符,那么 SQL Server 就会满意。

如果我在以 Z 结尾的 Base64 字符串上运行上述 C# 代码,但将该字符替换为 =,则代码运行良好,并且生成的输出图像为小 1 个字节,但(显然)呈现相同。

所以我的问题:

  1. Z 结尾 Base64 字符串是否有效?
  2. 哪一个行为不当:C# 接受无效的 Base64 字符串,还是 SQL Server 拒绝有效字符串?
  3. Z 替换为 = 以使 SQL Server 不会呕吐是否安全?换句话说,是否有可能生成的字节不是有效的 JPG 数据?

最佳答案

  1. 是的。
  2. 都不是,见下文。
  3. 不再相关,请参见下文。

经过多次探索,我发现 psn.Portrait 中的数据包含尾随 NUL (\0) 字符,该字符未显示在 SQL Server Management Studio 中运行 select 时。因此,每次我从 SSMS 复制数据以作为文字进行测试时,它不会有尾随 NUL,因此会正确解码。当然,当引用列中的实际值时,NUL 随之而来,导致 MSSQL 正确拒绝该字符串。

在 C# 方面,Sql.SelectSingleString 辅助方法中有一行内容为 result.Trim('\0')。我无法理解为什么它在那里,但这解释了为什么 C# 没有被 NUL 窒息......它不在那里被窒息。

关于sql-server - C# 和 SQL Server 对于字符串是否有效 Base64 存在分歧 - 哪个是正确的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21939903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com