2024年10月24日 星期四

[研究]ASP.NET + WebForm, SQL Server 的 UUID, UID, GUID 差別 ? 如何產生 ?

[研究]ASP.NET + WebForm, SQL Server 的 UUID, UID, GUID 差別 ? 如何產生 ?

2024-10-24

ASP.NET, WebForm, uuid 和 uid 和 guid 差別 ? 如何產生 ?

ChatGPT 說:

在 ASP.NET WebForms 和 C# 中,UUID、UID 和 GUID 這三個詞在使用中有些重疊,但它們有不同的背景和技術含義。讓我逐一解釋它們的差別:

1. UUID (Universally Unique Identifier)

  • 定義來自 RFC 4122。
  • 是 128 位的唯一識別碼,通常以 32 個十六進位數字表示,格式如:550e8400-e29b-41d4-a716-446655440000。
  • UUID 是一種通用的標準,用於生成全局唯一的標識符,主要在跨平台的應用中使用。

2. GUID (Globally Unique Identifier)

  • GUID 是 Microsoft 針對 UUID 的實現,因此它們在技術上是等效的。GUID 同樣是 128 位的數值,具有相同的格式和結構,如:c56a4180-65aa-42ec-a945-5fd21dec0538。
  • GUID 是 Windows 和 .NET 框架中對這一標準的稱呼。
  • 在 C# 和 ASP.NET 中,GUID 是標準類型,用於生成唯一的標識符。

3. UID (Unique Identifier)

  • UID 是一個更寬泛的術語,表示任何類型的唯一標識符,可以是數字、字母組合等。它不具備像 UUID/GUID 那樣的具體定義。UID 可以用於任何上下文中,例如資料庫中的主鍵等。

在編程上下文中,當需要全球唯一的標識時,通常會使用 UUID 或 GUID。

********************************************************************************

C# 產生一個新的 GUID

Guid newGuid = Guid.NewGuid();
Console.WriteLine(newGuid.ToString());   

這將會輸出一個 GUID,如 e0d9c2fc-5c25-4c35-bb7b-4f830e9f383a。

********************************************************************************

SQL Server 使用 GUID

在 SQL Server 中,雖然沒有專門名為 GUID 的資料型態,但它使用 **uniqueidentifier** 資料型態來儲存 GUID 值。這個 uniqueidentifier 資料型態是專門設計來儲存 128 位元的 GUID(Globally Unique Identifier)的,等同於在其他系統中常見的 GUID 或 UUID。

每個 uniqueidentifier 欄位都可以儲存一個 128 位的 GUID。通常以字串格式表示(例如:A4C7F83D-A32D-4C8C-AC91-9D2A9F3F725B),但儲存在資料庫中的實際大小是固定的 16 個位元組。

SQL Server 使用 NewID() 或 NEWSEQUENTIALID() 函數生成 GUID,後者是根據時間順序排列的,相對於隨機產生的 NEWID(),NEWSEQUENTIALID() 更適合當作聚集索引,因為它能減少索引碎片,提升寫入性能。但後者使用較有限制,較具規則,可能會被猜。

********************************************************************************

補充:NEWSEQUENTIALID()的限制


UPDATE  [MyDB].[dbo].[MyTable4] 

SET [Field3]=NEWSEQUENTIALID() 

WHERE Field3 IS NULL;

出現錯誤

在 CREATE TABLE 或 ALTER TABLE 陳述式中,newsequentialid() 內建函數只能用於類型為 'uniqueidentifier' 之資料行的 DEFAULT 運算式中。它不可以和其他運算子結合,形成複雜的純量運算式。

ChatGPT 說:

NEWSEQUENTIALID() 函數只能在 CREATE TABLE 或 ALTER TABLE 的 DEFAULT 約束中使用,因此不能在 UPDATE 陳述式中直接使用 NEWSEQUENTIALID()。這是 SQL Server 的設計限制,因為 NEWSEQUENTIALID() 是為了生成唯一的、按順序遞增的 GUID,且只能自動用作插入新行時的預設值。

要解決這個問題,並且希望能夠更新 Field3 欄位值為 uniqueidentifier,你可以使用 NEWID() 函數來代替,因為它可以用於 UPDATE 陳述式中:

UPDATE [MyDB].[dbo].[MyTable4]

SET [Field3] = NEWID()

WHERE [Field3] IS NULL;

********************************************************************************

補充:LINQ

如果你正在使用 LINQ 且希望用 Uniqueidentifier 類型來生成新的 GUID 值,應該用 C# 的 Guid.NewGuid() 方法來生成一個新的 GUID。

private Uniqueidentifier NewGUID; // 錯誤寫法

private Guid NewGUID = Guid.NewGuid(); // 正確寫法

********************************************************************************

補充:網址中 GUID 字串參數轉換比對

Guid snGuid;
if (Guid.TryParse(Request["sn"], out snGuid))
{
    var Result = (from data in _MyDB.News
                  where data.NewsGUID == snGuid && data.IsApproved == true
                  select data).FirstOrDefault();
}
else
{
    // 處理無法解析為 GUID 的情況
}


(完)

沒有留言:

張貼留言