GUID: varchar(36) 与 uniqueidentifier的区别

19

我正在使用一个遗留数据库,该数据库将GUID值存储为varchar(36)数据类型:

CREATE TABLE T_Rows (
    RowID    VARCHAR(36) NOT NULL PRIMARY KEY,
    RowValue INT         NOT NULL
) 

INSERT T_Rows (RowID, RowValue) VALUES (NEWID(), 1)

我认为将GUID存储为uniqueidentifier会更好,因为它只有16个字节,而不是36个。

将GUID存储为varchar有什么优点吗?

5个回答

19

也许仅仅因为你可以从SELECT语句中“读取”它们(虽然我不认为这很有用,因为你可以在SELECT中使用函数来显示唯一标识符)。

如果表很大,每行节省20个字节就是相当可观的。


8
你将获得比这更多的东西,这是PK,因此如果有任何子表,它们也将具有成本节省。如果表上有其他索引并且这是聚集索引,则所有索引的大小(可能也包括速度,但需要测试以确保)将更小。当然,基于许多原因,INT作为PK会更好,但对于遗留数据库来说,这是一个巨大的变化。 - HLGEM
7
为什么 Entity Framework 在其 GUID 中使用 nvarchar(128)?我能否将其替换为 uniqueidentifier - Zapnologica

7
我会选择uniqueidentifier作为标识符,原因如下:
1. 占用空间更小; 2. 唯一性保证不会重复; 3. 更适合于比较和性能方面的问题,同时也更容易获取独特的默认值等。
除非有特殊原因需要使用varchar,否则我会一直使用uniqueidentifier。

1
如果我可以补充一下,当使用联合数据库时,这也更好。我会像所述那样选择 GUIDs。 - code5

3

我相信UNIQUEIDENTIFIER是在SQL Server 2000中添加的,因此这个应用程序最初可能是为不支持它的SQL Server 7编写的。但当然这只是猜测...


2

如果您的数据库是Oracle,那么在旧版本的Oracle(9)中,原始数据的索引性能比索引一个varchar(36)字段要差得多。幸运的是,在Oracle 10和11中,这种情况已经改变了。


0
绝对不行,正如您所知道的,传统数据库经常存在设计缺陷 :P 因为GUID是16字节,它在数据库中可能占用16字节。您将获得每个条目的20个字节。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接