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

长度是多少 varchar 我应该期待 GUID 吗?它是静态长度吗?

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

varchar(Guid.Length)

附言。我不想使用 SQL 行 guid 数据类型。我只是问什么是 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 字符(十六进制)
    输出: {0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0x9a,0xbc}}

其他提示

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

12345678-1234-1234-1234-123456789012

这是一个在任何GUID 36个字符 - 它们是恒定的长度。你可以阅读一些有关的GUID的错综复杂这里

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

注意:36是与之间的破折号字符串长度。它们实际上是16个字节的号码。

正确的事情做的,是将其存储为uniqueidentifier - 这是再完全可转位等,在数据库中。下一个最佳选择是一个binary(16)柱:标准的GUID的长度正好是16个字节

如果你必须将它保存为一个字符串,长度其实就是要你选择如何编码。作为十六进制(AKA基16编码),而不连字符这将是32个字符(每字节两个十六进制数字),所以char(32)

不过,您可能的的存储连字符。如果你是空间不足,但你的数据库不支持的斑点/ GUID的本身,你可以使用的Base64编码和删除所述==填充后缀;那给你22个字符,所以char(22)。没有必要使用Unicode,并且不需要可变长度 - 所以nvarchar(max)将是一个坏的选择,例如

相信的GUID被约束到16字节的长度(或者用于十六进制的ASCII当量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)

所以,是,最好20个字符长,这实际上是浪费以上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('=');

二进制字符串存储原始字节的数据,而字符串存储文本。存储河西十进制值,如SIDGUID等时使用的二进制数据。唯一标识符的数据类型包含全局唯一标识符或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服务器 下面的示例创建具有唯一标识符数据类型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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top