我想在SQL中创建一个varchar列,该列应该包含N'guid'
,而guid
是由.NET(Guid.NewGuid)类System.Guid生成的GUID。
GUID中varchar
的长度应该是多少?它是静态长度吗?
我应该使用nvarchar
吗(GUID会使用Unicode字符吗)?
varchar(Guid.Length)
我不想使用SQL行guid数据类型。我只是问什么是Guid.MaxLength
。
我想在SQL中创建一个varchar列,该列应该包含N'guid'
,而guid
是由.NET(Guid.NewGuid)类System.Guid生成的GUID。
GUID中varchar
的长度应该是多少?它是静态长度吗?
我应该使用nvarchar
吗(GUID会使用Unicode字符吗)?
varchar(Guid.Length)
我不想使用SQL行guid数据类型。我只是问什么是Guid.MaxLength
。
7条答案
按热度按时间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}}
q1qsirdb2#
36,并且GUID将仅使用0-9A-F(十六进制!)。
12345678-1234-1234-1234-123456789012
任何GUID都有36个字符--它们的长度是恒定的。您可以阅读更多关于GUID here的复杂性的内容。
如果你想存放大括号,你还需要两个更长的。
注意:36是字符串长度,中间是破折号。它们实际上是16字节的数字。
qlvxas9a3#
这里正确的做法是将其存储为
uniqueidentifier
-这样就可以在数据库中完全建立索引等。次佳选择是binary(16)
列:标准GUID的长度正好是16字节。如果你必须把它存储为字符串,那么长度实际上取决于你选择的编码方式,如果是十六进制(AKA base-16编码),没有连字符,它将是32个字符(每个字节两个十六进制数字),所以
char(32)
。但是,您可能希望存储连字符,如果空间不足,但数据库不支持blob/guid,则可以使用Base64编码并删除
==
填充后缀;这给了你22个字符,所以char(22)
,不需要使用Unicode,也不需要变长,所以nvarchar(max)
是个糟糕的选择。w8ntj3qf4#
我认为GUID的长度限制为16字节(对于ASCII十六进制等价物为32字节)。
irtuqstp5#
GUID为128位,或
所以是的,最少20个字符长,这实际上浪费了超过4.25位,所以你可以同样有效地使用小于95的碱基;基数85是仍然适合20个字符的最小可能基数:
:—)
2w3rbyxf6#
22个字节,如果你这样做:
pobjuy327#
二进制字符串存储原始字节数据,而字符串存储文本。在存储十六进制-十进制值(如
SID
、GUID
等)时,请使用二进制数据。uniqueidentifier数据类型包含全局唯一标识符,或GUID。此值是使用NEWID派生的()函数返回一个对所有对象都唯一的值。它存储为二进制值,但显示为字符串。这里有一个例子。
适用于:SQL Server下面的示例创建具有uniqueidentifier数据类型的cust表,并使用NEWID用默认值填充该表。在分配NEWID()的默认值时,每个新行和现有行的CustomerID列都具有唯一值。