GUID:VARCHAR(36)与唯一标识符

问题描述:

我正在与存储GUID值作为一个varchar(36)的数据类型的传统数据库工作: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作为唯一标识符将是可取的,因为它只有16字节大小,而不是36.

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

+0

我非常怀疑它! – 2010-08-19 23:26:38

也许只有你可以从SELECT语句中读取它们的事实(尽管我不认为这样做特别有用,因为你可以在select中使用一个函数来使Uniqueidentifiers可显示)。

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

+6

YOu会获得更多,这是PK,所以如果有任何子表,他们也会节省成本。如果表中有任何其他索引,并且它是聚簇索引,则所有索引的大小(以及可能的速度但可以确定的测试)将会更小。 Coursre和INT在许多原因上都是更好的PK,但这是遗留数据库的巨大变化。 – HLGEM 2010-08-20 14:08:27

+2

为什么entity-framework会为其GUID使用'nvarchar(128)'?我可以把它换成'uniqueidentifier'吗? – Zapnologica 2017-09-12 19:34:38

绝对不是,因为我确定您知道遗留数据库经常遭受设计缺陷:P因为GUID是16个字节,所以它可能在数据库中占用16个字节。您将获得每个条目的20个字节

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

我会唯一标识符的原因有很多,如走,

将需要更少的空间;它是独一无二的,所以它不能被复制。这比较好,特别是性能相关的问题,以及容易获得独特的默认值等。

我会使用uniqueidentifier,除非我需要使用varchar为非常具体的原因。

+1

如果我可以添加。使用联合数据库时也更好。我会按照陈述去做guid。 – code5 2015-04-16 21:01:44

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