我想在SQL中创建一个应该包含N'guid'
的varchar列,而guid
是由.NET(Guid.NewGuid)生成的GUID - 类System.Guid。
我应该从GUID中获得varchar
的长度是多少?
它是静态长度吗?
我应该使用nvarchar
(GUID会使用Unicode字符吗?)
varchar(Guid.Length)
PS。我不想使用SQL行guid数据类型。我只是问Guid.MaxLength
是什么。
答案 0 :(得分:685)
这取决于你如何格式化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}}
答案 1 :(得分:62)
36,GUID只使用0-9A-F(十六进制!)。
12345678-1234-1234-1234-123456789012
任何GUID中有36个字符 - 它们的长度不变。您可以阅读更多有关GUID here的错综复杂信息。
如果你想存放牙箍,你需要再长两个。
注意:36是字符串长度,中间用破折号。它们实际上是16字节的数字。
答案 2 :(得分:27)
这里要做的正确的事情是将其存储为uniqueidentifier
- 然后在数据库中完全可索引等。下一个最佳选项是binary(16)
列:标准GUID的长度恰好是16个字节。
如果您必须将其存储为字符串,那么长度实际上取决于您选择如何对其进行编码。由于十六进制(AKA base-16编码)没有连字符,它将是32个字符(每个字节两个十六进制数字),所以char(32)
。
但是,您可能希望存储连字符。如果您的空间不足,但您的数据库本身不支持blob / guid,则可以使用Base64编码并删除==
填充后缀;它给你22个字符,所以char(22)
。没有必要使用Unicode,也不需要可变长度 - 例如,nvarchar(max)
将是一个糟糕的选择。
答案 3 :(得分:9)
我认为GUID约束为16字节长度(或者对于ASCII十六进制等效字符为32字节)。
答案 4 :(得分:5)
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更小的基数同样高效; base 85是最小的,仍然适合20个字符:
0 through -r54lj%NUUO[Hi$c2ym0 (base 85, using 0-9A-Za-z!"#$%&'()*+,- chars)
: - )
答案 5 :(得分:3)
22个字节,如果你这样做:
System.Guid guid = System.Guid.NewGuid();
byte[] guidbytes = guid.ToByteArray();
string uuid = Convert.ToBase64String(guidbytes).Trim('=');
答案 6 :(得分:0)
二进制字符串存储原始字节数据,而字符串存储文本。存储hexi-decimal值时使用二进制数据,例如SID
,GUID
等。 uniqueidentifier数据类型包含全局唯一标识符或GUID。这个
通过使用NEWID()函数返回所有对象唯一的值来派生value。它存储为二进制值,但显示为字符串。
这是一个例子。
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