在C#中,我有一个byte[]名为UniqueId的字段。我将此字段存储为SQL Server数据库(EF6)中的Binary(16)。
我注意到有时,存储的guid是15个字节而不是16个字节。var guid = new Guid(uniqueId)从数据库中检索值后,这会导致以下异常:
System.ArgumentException:GUID的字节数组必须恰好是16个字节长。
在对此进行调查之后,我注意到,只要生成的guid在十六进制末尾包含“ 00”,SQL就会将其截断!
例:
生成的Guid(通过Guid.NewGuid): FF96F954777E8941A04774CD157C5C00(16字节)
在SQL Server中存储二进制(16):0xFF96F954777E8941A04774CD157C5C(15字节)
如果您注意到,00末尾的将被截断。结果,如果我查询此字段并尝试将其字节转换为Guid,则会得到一个System.ArgumentException。
还有其他人遇到这个问题吗?解决方法是什么?我正在考虑一个包装器,Guid该包装器会一直生成向导,直到没有尾随零为止,但这似乎很hack。
更新1:由于你们的要求,我运行了SQL事件探查器,这是由EF(节略版)生成的SQL:
exec sp_executesql N'INSERT [dbo].[customers]([UniqueId])
VALUES (@0)',N'@0 varbinary(max)',@0=0xFF96F954777E8941A04774CD157C5C00
Run Code Online (Sandbox Code Playgroud)