422

我想在 SQL 中创建一个 varchar 列,该列应该包含N'guid'whileguid是由 .NET ( Guid.NewGuid ) 生成的 GUID - 类 System.Guid。

varchar我应该期望 GUID的长度是多少?是静态长度吗?

我应该使用nvarchar(GUID 是否会使用 Unicode 字符)?

varchar(Guid.Length)

PS。我不想使用 SQL 行 guid 数据类型。我只是问什么是Guid.MaxLength.

4

7 回答 7

883

这取决于您如何格式化 Guid:

  • Guid.NewGuid().ToString()= 36 个字符(连字符)
    输出:12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("D")= 36 个字符(连字符,与 相同ToString()
    输出:12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("N")= 32 个字符(仅限数字)
    输出:12345678123412341234123456789abc

  • Guid.NewGuid().ToString("B")= 38 个字符(大括号)
    输出:{12345678-1234-1234-1234-123456789abc}

  • Guid.NewGuid().ToString("P")= 38 个字符(括号)
    输出:(12345678-1234-1234-1234-123456789abc)

  • Guid.NewGuid().ToString("X")= 68 个字符(十六进制)
    输出:{0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0x9a,0xbc}}

于 2010-12-16T08:53:05.297 回答
71

36,并且 GUID 将仅使用 0-9A-F(十六进制!)。

12345678-1234-1234-1234-123456789012

这是任何 GUID 中的 36 个字符——它们的长度是恒定的。您可以在此处阅读有关 GUID 复杂性的更多信息。

如果要存放牙套,则需要多两个长度。

注意:36 是字符串长度,中间有破折号。它们实际上是 16 字节的数字。

于 2009-06-09T04:46:41.203 回答
40

正确的做法是将其存储为uniqueidentifier- 然后在数据库中完全可索引等。下一个最佳选项是binary(16)列:标准 GUID 的长度正好是 16 个字节。

如果您必须将其存储为字符串,则长度实际上取决于您选择如何对其进行编码。作为没有连字符的十六进制(AKA base-16 编码),它将是 32 个字符(每个字节两个十六进制数字),所以char(32).

但是,您可能想要存储连字符。如果您的空间不足,但您的数据库本身不支持 blob/guid,则可以使用Base64编码并删除==填充后缀;这给了你 22 个字符,所以char(22). 不需要使用 Unicode,也不需要可变长度 -nvarchar(max)例如,这将是一个糟糕的选择。

于 2014-10-14T09:49:11.557 回答
10

我相信 GUID 被限制为 16 字节的长度(或 ASCII 十六进制等效的 32 字节)。

于 2009-06-09T04:47:35.460 回答
7

GUID 为 128 位,或

0 through ffffffffffffffffffffffffffffffff (hex) or 
0 through 340282366920938463463374607431768211455 (decimal) or 
0 through 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 (binary, base 2) or 
0 through 91"<b.PX48m!wVmVA?1y (base 95)

所以是的,最少 20 个字符长,这实际上浪费了超过 4.25 位,所以你可以使用比 95 更小的基数来提高效率;以 85 为基数的最小可能仍然适合 20 个字符:

0 through -r54lj%NUUO[Hi$c2ym0 (base 85, using 0-9A-Za-z!"#$%&'()*+,- chars)

:-)

于 2015-10-29T04:02:09.510 回答
7

22 字节,如果你这样做:

System.Guid guid = System.Guid.NewGuid();
byte[] guidbytes = guid.ToByteArray();
string uuid = Convert.ToBase64String(guidbytes).Trim('=');
于 2017-01-19T21:43:36.053 回答
1

二进制字符串存储原始字节数据,而字符串存储文本。存储十六进制值时使用二进制数据,例如SID,GUID等等。uniqueidentifier 数据类型包含一个全局唯一标识符或 GUID。此值是通过使用 NEWID() 函数派生的,以返回一个对所有对象都是唯一的值。它存储为二进制值,但显示为字符串。

这是一个例子。

USE AdventureWorks2008R2;
GO
CREATE TABLE MyCcustomerTable
(
    user_login   varbinary(85) DEFAULT SUSER_SID()
    ,data_value   varbinary(1)
);
GO

INSERT MyCustomerTable (data_value)
    VALUES (0x4F);
GO

适用于:SQL Server 以下示例创建具有 uniqueidentifier 数据类型的 cust 表,并使用 NEWID 用默认值填充表。在分配 NEWID() 的默认值时,每个新的和现有的行都具有 CustomerID 列的唯一值。

-- Creating a table using NEWID for uniqueidentifier data type.  
CREATE TABLE cust  
(  
 CustomerID uniqueidentifier NOT NULL  
   DEFAULT newid(),  
 Company varchar(30) NOT NULL,  
 ContactName varchar(60) NOT NULL,   
 Address varchar(30) NOT NULL,   
 City varchar(30) NOT NULL,  
 StateProvince varchar(10) NULL,  
 PostalCode varchar(10) NOT NULL,   
 CountryRegion varchar(20) NOT NULL,   
 Telephone varchar(15) NOT NULL,  
 Fax varchar(15) NULL  
);  
GO  
-- Inserting 5 rows into cust table.  
INSERT cust  
(CustomerID, Company, ContactName, Address, City, StateProvince,   
 PostalCode, CountryRegion, Telephone, Fax)  
VALUES  
 (NEWID(), 'Wartian Herkku', 'Pirkko Koskitalo', 'Torikatu 38', 'Oulu', NULL,  
 '90110', 'Finland', '981-443655', '981-443655')  
,(NEWID(), 'Wellington Importadora', 'Paula Parente', 'Rua do Mercado, 12', 'Resende', 'SP',  
 '08737-363', 'Brasil', '(14) 555-8122', '')  
,(NEWID(), 'Cactus Comidas para Ilevar', 'Patricio Simpson', 'Cerrito 333', 'Buenos Aires', NULL,   
 '1010', 'Argentina', '(1) 135-5555', '(1) 135-4892')  
,(NEWID(), 'Ernst Handel', 'Roland Mendel', 'Kirchgasse 6', 'Graz', NULL,  
 '8010', 'Austria', '7675-3425', '7675-3426')  
,(NEWID(), 'Maison Dewey', 'Catherine Dewey', 'Rue Joseph-Bens 532', 'Bruxelles', NULL,  
 'B-1180', 'Belgium', '(02) 201 24 67', '(02) 201 24 68');  
GO
于 2017-10-07T12:49:24.320 回答