GUID的字符串长度是多少?

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

我应该从GUID中期望的varchar的长度是多少? 它是静态长度吗?< / p >

我应该使用nvarchar(将GUID使用Unicode字符)?

varchar(Guid.Length)

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

418633 次浏览

36, GUID将只使用0-9A-F(十六进制!)

12345678-1234-1234-1234-123456789012

在任何GUID中都是36个字符——它们的长度是恒定的。你可以阅读更多关于GUIDs 在这里的复杂内容。

如果您想存储大括号,还需要两个长度。

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

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

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

  • Guid.NewGuid().ToString() = 36 characters(连字符)
    输出:12345678-1234-1234-1234-123456789abc < / p >

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

  • Guid.NewGuid().ToString("N") = 32 characters(仅限数字)
    输出:12345678123412341234123456789abc < / p >

  • Guid.NewGuid().ToString("B") = 38 characters(花括号)
    输出:{12345678-1234-1234-1234-123456789abc} < / p >

  • Guid.NewGuid().ToString("P") = 38 characters(括号)
    输出:(12345678-1234-1234-1234-123456789abc) < / p >

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

这里要做的正确的的事情是将其存储为uniqueidentifier -然后在数据库中完全可索引等。次优选项是binary(16)列:标准guid的长度正好是16字节。

如果您必须将其存储为字符串,那么长度实际上取决于您选择如何编码它。作为没有连字符的十六进制编码(又名base-16编码),它将是32个字符(每个字节两个十六进制数字),因此char(32)

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

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为基数的十进制十进制十进制十进制十进制十进制十进制十进制十进制十进制十进制十进制十进制十进制十进制十进制

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('=');

二进制字符串存储原始字节数据,而字符串存储文本。在存储诸如SIDGUID等十六进制值时使用二进制数据。uniqueidentifier数据类型包含一个全局唯一标识符,即GUID。这 value通过使用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