什么是GUID的string长度?

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

什么是我应该期望从一个GUID varchar的长度? 这是一个静态的长度?

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

 varchar(Guid.Length) 

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

这取决于你如何格式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个字符(hex)
    输出: {0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0x9a,0xbc}}

36,并且GUID将只使用0-9A-F(hex!)。

12345678-1234-1234-1234-123456789012

这是任何GUID的36个字符 – 他们是恒定的长度。 您可以在这里阅读更多有关GUID错综复杂的内容。

如果你想存储大括号,你将需要更多的长度。

注意:36是中间有破折号的string长度。 他们实际上是16字节的数字。

这里要做的正确的事情是把它作为uniqueidentifier存储起来,然后在数据库中完全索引等等。 次最好的select将是一个binary(16)列:标准的GUID是正好16个字节的长度。

如果你必须把它作为一个string存储起来,那么这个长度真的取决于你如何select编码。 作为不带连字符的hex(AKA base-16编码),它将是32个字符(每个字节两个hex数字),所以char(32)

但是,您可能需要存储连字符。 如果空间不足,但数据库本身不支持blob / guid,则可以使用Base64编码并删除==填充后缀; 这给你22个字符,所以char(22) 。 没有必要使用Unicode,也不需要可变长度,所以nvarchar(max)是不好的select。

我相信GUID被限制在16个字节的长度(或者对于ASCIIhex等价的32个字节)。

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) 

所以,是的,最less20个字符,实际上是浪费了超过4.25位,所以你可以使用比95更小的基地效率, 基地85是最小的可能仍然适合20个字符:

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

🙂

22个字节,如果你这样做:

 System.Guid guid = System.Guid.NewGuid(); byte[] guidbytes = guid.ToByteArray(); string uuid = Convert.ToBase64String(guidbytes).Trim('='); 

二进制string存储原始字节数据,而string存储文本。 存储Hexi十进制值(如SIDGUID等)时使用二进制数据。 uniqueidentifier数据types包含全局唯一标识符或GUID。 这个值是通过使用NEWID()函数返回一个对所有对象唯一的值来派生的。 它被存储为一个二进制值,但它显示为一个string。

这是一个例子。

 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数据types创buildcust表,并使用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