我想在SQL中创建一个varchar列,该列应包含N'guid'
,而guid
是由.NET(Guid.NewGuid)生成的GUID - 类System.Guid。
从GUID中可以期望得到什么长度的varchar
?这是一个静态长度吗?
我应该使用nvarchar
吗(GUID是否会使用Unicode字符)?
varchar(Guid.Length)
顺便说一下,我不想使用SQL行GUID数据类型。我只是想知道Guid.MaxLength
是什么。
我想在SQL中创建一个varchar列,该列应包含N'guid'
,而guid
是由.NET(Guid.NewGuid)生成的GUID - 类System.Guid。
从GUID中可以期望得到什么长度的varchar
?这是一个静态长度吗?
我应该使用nvarchar
吗(GUID是否会使用Unicode字符)?
varchar(Guid.Length)
顺便说一下,我不想使用SQL行GUID数据类型。我只是想知道Guid.MaxLength
是什么。
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}}
byte[16]
。" - Eric Falsken36个字符,GUID仅使用0-9A-F(十六进制)!
12345678-1234-1234-1234-123456789012
任何GUID都是36个字符的长度。 如果您想存储大括号,则需要两个额外的长度。
注意:36是带有破折号的字符串长度。 它们实际上是16字节的数字。
您可以在这里阅读有关GUID的详细信息。
在这里做正确的事情是将其存储为uniqueidentifier
- 这样就可以完全索引化等等。如果不得已必须将其存储为字符串,则长度实际上取决于您选择如何对其进行编码。作为十六进制(也称为基础16编码)而没有连字符,它将是32个字符(每个字节两个十六进制数字),因此是char(32)
。
但是,您可能希望保留连字符。如果您的数据库不支持原生的blob / guid,但空间有限,则可以使用Base64编码并删除==
填充后缀;这给您提供了22个字符,因此是char(22)
。无需使用Unicode,也不需要可变长度-例如,nvarchar(max)
是一个不好的选择。
uniqueidentifer
是完全可索引的,但 binary(16)
却不是? - BaltoStarGUID是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等)时,请使用二进制数据。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来为表填充默认值。在为CustomerID列分配NEWID()的默认值时,每个新的和现有的行都具有唯一的值。
-- 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
Guid.NewGuid
没有隐含的“字符串长度”;它取决于在 ToString 中使用的格式(无参数的ToString
使用 “D” 格式)。我更喜欢使用 “B”,因为这样更容易“看出它是一个 GUID”,但这只是熟悉和惯例。 - user166390