GUID的字符串长度是多少?

Shi*_*mmy 335 .net varchar guid sql-types string-length

我想在SQL中应包含创建VARCHAR列N'guid'guid被生成由.NET GUID(Guid.NewGuid) -类的System.Guid.

varchar我应该从GUID中获得的长度是多少?它是静态长度吗?

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

varchar(Guid.Length)
Run Code Online (Sandbox Code Playgroud)

PS.我不想使用SQL行guid数据类型.我只想问是什么Guid.MaxLength.

ste*_*ell 723

这取决于你如何格式化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}}

  • 我想补充说Guid是一个128位无符号整数.您还可以将其存储为16字节数组`byte [16]`. (23认同)
  • 关于"仅数字"和"N"选项的评论有点棘手!你应该把它读成没有括号和连字符 (4认同)
  • ps,还有另一个选项:Guid.NewGuid().ToString("X")=> 68个字符输出:{0x12345678,0x1234,0x1234,{0x12,0x23,0x12,0x34,0x56,0x78,0x9a,0xbc}} (3认同)
  • 哦,然后它是'Hyphen'与H(我在字典中查找,并没有找到hypen)...谢谢 (2认同)

Eri*_*ric 63

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

12345678-1234-1234-1234-123456789012

这是任何GUID中的36个字符 - 它们具有恒定的长度.您可以在此处阅读有关GUID复杂性的更多信息.

如果要存放牙箍,则需要两个长度.

注意:36是字符串长度,中间用破折号.它们实际上是16字节的数字.

  • 这对.NET来说是错误的; 你只能得到36个字符!您确实获得了C#可视化工具的大括号(38个字符),但没有代码! (7认同)
  • 埃里克,我很确定你第一次就做对了.guid.ToString()返回一个长度为36的字符串,没有大括号. (3认同)
  • 我认为用 {} 表示一个表示,因此最多意味着 38 (2认同)

Mar*_*ell 30

这里正确的做法是将其存储为uniqueidentifier- 然后在数据库中完全可索引等.下一个最佳选项是binary(16)列:标准GUID的长度恰好是16个字节.

如果必须将其存储为字符串,则长度实际上取决于您选择如何编码.作为没有连字符的十六进制(AKA base-16编码),它将是32个字符(每个字节两个十六进制数字),所以char(32).

但是,您可能希望存储连字符.如果空间不足,但数据库本身不支持blob/guid,则可以使用Base64编码并删除==填充后缀; 这给你22个字符,所以char(22).没有必要使用Unicode,也不需要可变长度 - nvarchar(max)例如,这将是一个糟糕的选择.

  • 为什么 `uniqueidentifer` 是完全可索引的,而 `binary(16)` 却不是? (2认同)

Ros*_*ght 9

我相信GUID约束为16字节长度(或ASCII十六进制等效的32字节).


小智 6

22 字节,如果你这样做:

System.Guid guid = System.Guid.NewGuid();
byte[] guidbytes = guid.ToByteArray();
string uuid = Convert.ToBase64String(guidbytes).Trim('=');
Run Code Online (Sandbox Code Playgroud)


cnd*_*cnd 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)
Run Code Online (Sandbox Code Playgroud)

所以是的,最多20个字符,这实际上浪费了超过4.25位,所以你可以使用比95更小的基数同样有效; base 85是最小的,仍然适合20个字符:

0 through -r54lj%NUUO[Hi$c2ym0 (base 85, using 0-9A-Za-z!"#$%&'()*+,- chars)
Run Code Online (Sandbox Code Playgroud)

:-)