2011-04-17 128 views
1

我正在更換一些GUID列類型,因爲我需要在MSSQL 2008中做一些Group By工作。我正在將類型更改爲Char(36),因爲我知道值的確切大小,但在Google搜索後有點I看到很多人在做Varchar(36)。在這種情況下做CHAR不是更好嗎?VarChar(36)或Char(36)的SQL Server GUID?

+0

只是感興趣。爲什麼你需要在組中使用'varchar/char'而不是'uniqueidentifier'? – 2011-04-17 04:47:11

+0

對非常大的URL數據集合進行聚合並且URL由GUID別名,需要進行一些分組並且不能用Uniqueidentifier AFAIK完成。 – Snowy 2011-04-21 00:07:55

+0

我所做的簡單測試顯示沒有問題。我發現http://www.sqlservercentral.com/articles/Data+Types/uniqueidentifierusageandlimitations/1406/。一篇相當古老的文章可能就是SQL Server 2000中的情況。我已經在SQL Server 2005和2008中進行過測試。 – 2011-04-21 10:57:59

回答

3

CHAR和VARCHAR的區別在於空間是如何分配的。 CHAR字段始終是定義的大小,但直到VARCHAR字段實際上包含數據,它纔會佔用0個字節。

就你而言,因爲你總是要存儲36個字符,所以我建議你繼續使用CHAR。如果您正在存儲不同長度的數據,請使用VARCHAR。

但是,你真的想在GUID上使用GROUP BY嗎?他們被稱爲「全球唯一標識符」是有原因的。或者是將它們分開,然後按照GUID的某些部分進行分組(總體來說可能是相同的,但總的來說,沒有一個是相同的)。

+0

如果總結出與guid有關的多條記錄,則通過on guid進行分組是有意義的。 – Chalky 2014-05-12 04:27:38

0

快速回答:使用CHAR(36)或更好的BINARY(16)。

長的答案:你可能會更好的離開列類型,並在您的查詢中使用CAST。

DECLARE @a TABLE (x UNIQUEIDENTIFIER, y INT) 
-- Insert some data here 
SELECT 
    MIN(y), 
    CAST(a.x AS BINARY(16)) 
FROM 
    @a AS a 
GROUP BY 
    CAST(a.x AS BINARY(16)) 
相關問題