我想创建一个SQL VARCHAR列应包含N'guid'
而guid
是.NET中生成的GUID( Guid.NewGuid ) -类的System.Guid。
什么是长度varchar
我应该从一个GUID期待? 它是一个静态的长度是多少?
我应该使用nvarchar
(GUID将永远使用Unicode字符)?
varchar(Guid.Length)
PS。 我不希望使用SQL行GUID数据类型。 我只是问什么是Guid.MaxLength
。
我想创建一个SQL VARCHAR列应包含N'guid'
而guid
是.NET中生成的GUID( Guid.NewGuid ) -类的System.Guid。
什么是长度varchar
我应该从一个GUID期待? 它是一个静态的长度是多少?
我应该使用nvarchar
(GUID将永远使用Unicode字符)?
varchar(Guid.Length)
PS。 我不希望使用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字节的长度(或32个字节用于ASCII十六进制当量)。
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('=');
二进制字符串存储原始字节的数据,而字符串存储文本。 存储河西十进制值,例如当使用二进制数据SID
, GUID
等。 唯一标识符的数据类型包含全局唯一标识符或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中的以下示例将创建一个唯一标识符数据类型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