[研究]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 的情況 } |
(完)
沒有留言:
張貼留言