.NET有兩種GUID數據類型:Guid,它以「自然」方式排序GUID,SqlGuid,它認爲最後一個短劃線之後的六個字節是最重要的。這個差異在這裏詳細解釋:MSDN: Comparing GUID and uniqueidentifier Values。GUID比較奇怪
然而,在這兩種情況下,下面應持有(假設所有...
s爲相等):
57d0affe-... < 57d0afff-... < 57d0b000-...
如果是這樣的話,爲什麼我得到下面的輸出(見註釋)?
using System;
using System.Data.SqlTypes;
class Program
{
static void Main(string[] args)
{
var g1 = new SqlGuid("57d0affe-9d9d-11e4-bec2-e840f2ad1632");
var g2 = new SqlGuid("57d0afff-9d9d-11e4-bec2-e840f2ad1632");
var g3 = new SqlGuid("57d0b000-9d9d-11e4-bec2-e840f2ad1632");
Console.WriteLine(g1 < g2); // prints True
Console.WriteLine(g2 < g3); // prints False <- ?
Console.ReadLine();
}
}
據我所知,g2 < g3
也應該產生True。我誤解了一些東西,或者這是框架中的一些錯誤嗎?如使用普通Guid
而不是SqlGuid
,則輸出爲預期的兩倍True
。
你爲什麼要擺在首位比較GUID值?我不確定是否有訂購GUID的標準。如果您希望可訂列使用整數或GUID以外的其他值。 –
@DStanley:在SQL Server中使用GUID作爲主鍵(或聚簇索引)時,排序*很重要(性能方面)。這就是爲什麼像'newsequentialid()'這樣的東西存在。 – Heinzi
如果您需要更多上下文:我們使用Win32 API函數UuidCreateSequential創建將來插入數據庫的記錄的ID。我們的.NET包裝到UuidCreateSequential的單元測試開始出現故障,這讓我意識到了這個問題。 – Heinzi