.net GUID的字符串长度是多少?

7ivaypg9  于 2023-02-10  发布在  .NET
关注(0)|答案(7)|浏览(367)

我想在SQL中创建一个varchar列,该列应该包含N'guid',而guid是由.NET(Guid.NewGuid)类System.Guid生成的GUID。
GUID中varchar的长度应该是多少?它是静态长度吗?
我应该使用nvarchar吗(GUID会使用Unicode字符吗)?

varchar(Guid.Length)

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

dw1jzc5e

dw1jzc5e1#

这取决于您如何设置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}}

q1qsirdb

q1qsirdb2#

36,并且GUID将仅使用0-9A-F(十六进制!)。
12345678-1234-1234-1234-123456789012
任何GUID都有36个字符--它们的长度是恒定的。您可以阅读更多关于GUID here的复杂性的内容。
如果你想存放大括号,你还需要两个更长的。
注意:36是字符串长度,中间是破折号。它们实际上是16字节的数字。

qlvxas9a

qlvxas9a3#

这里正确的做法是将其存储为uniqueidentifier-这样就可以在数据库中完全建立索引等。次佳选择是binary(16)列:标准GUID的长度正好是16字节。
如果你必须把它存储为字符串,那么长度实际上取决于你选择的编码方式,如果是十六进制(AKA base-16编码),没有连字符,它将是32个字符(每个字节两个十六进制数字),所以char(32)
但是,您可能希望存储连字符,如果空间不足,但数据库不支持blob/guid,则可以使用Base64编码并删除==填充后缀;这给了你22个字符,所以char(22),不需要使用Unicode,也不需要变长,所以nvarchar(max)是个糟糕的选择。

w8ntj3qf

w8ntj3qf4#

我认为GUID的长度限制为16字节(对于ASCII十六进制等价物为32字节)。

irtuqstp

irtuqstp5#

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)

:—)

2w3rbyxf

2w3rbyxf6#

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

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

pobjuy327#

二进制字符串存储原始字节数据,而字符串存储文本。在存储十六进制-十进制值(如SIDGUID等)时,请使用二进制数据。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

相关问题