404 votes

Quelle est la longueur de la chaîne d'un GUID ?

Je veux créer une colonne varchar en SQL qui doit contenir N'guid' tandis que guid est un GUID généré par .NET ( Guid.NewGuid ) - classe System.Guid.

Quelle est la longueur de la varchar que je dois attendre d'un GUID ? S'agit-il d'une longueur statique ?

Dois-je utiliser nvarchar (le GUID utilisera-t-il jamais les caractères Unicode) ?

varchar(Guid.Length)

PS. Je ne veux pas utiliser un type de données SQL row guid. Je demande simplement ce qu'est Guid.MaxLength .

1 votes

Note : Guid.NewGuid n'a pas de "longueur de chaîne" implicite ; tout dépend du format utilisé dans le fichier ToString (L'option sans argument ToString utilise le formatage "D"). Je préfère le format "B" car il est plus facile de "voir qu'il s'agit d'un GUID", mais ce n'est qu'une question de familiarité et de convention.

9 votes

Pourquoi ne pas simplement l'enregistrer comme un identifiant unique de 16 octets ?

852voto

Stevo3000 Points 12725

Cela dépend de la façon dont vous formatez le Guid :

  • Guid.NewGuid().ToString() => 36 caractères (trait d'union)
    sorties : 12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("D") => 36 caractères (avec trait d'union, comme pour ToString() )
    sorties : 12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("N") => 32 caractères (chiffres uniquement)
    sorties : 12345678123412341234123456789abc

  • Guid.NewGuid().ToString("B") => 38 caractères (accolades)
    sorties : {12345678-1234-1234-1234-123456789abc}

  • Guid.NewGuid().ToString("P") => 38 caractères (entre parenthèses)
    sorties : (12345678-1234-1234-1234-123456789abc)

  • Guid.NewGuid().ToString("X") => 68 caractères (hexadécimaux)
    sorties : {0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0x9a,0xbc}}

1 votes

@Shimmy - Regardez le premier : "Hypénisé, identique à celui par défaut".

0 votes

Je n'ai aucune idée de ce que signifie "hypénée" :(

0 votes

@Shimmy - Un caractère hypène - est utilisé pour séparer les groupes.

69voto

Eric Points 35647

36, et le GUID n'utilisera que 0-9A-F (hexadécimal !).

12345678-1234-1234-1234-123456789012

Il y a 36 caractères dans un GUID - ils sont de longueur constante. Vous pouvez lire un peu plus sur les complexités des GUIDs. ici .

Il vous en faudra deux de plus en longueur si vous voulez ranger les bretelles.

Note : 36 est la longueur de la chaîne avec les tirets entre les deux. Il s'agit en fait de nombres de 16 octets.

2 votes

Je pense qu'une représentation est entourée de {}, ce qui signifie un maximum de 38.

4 votes

Je suis presque sûr que tu avais raison la première fois, Eric. guid.ToString() retourne une chaîne de longueur 36, sans accolades.

1 votes

Merci pour vous deux, ce dont j'aurai besoin est 36, j'ai dit que je voulais stocker Guid.NewGuid.

37voto

Marc Gravell Points 482669

Le site correct La chose à faire ici est de le stocker comme uniqueidentifier - ce qui est ensuite entièrement indexable, etc. dans la base de données. La meilleure option suivante serait un binary(16) colonne : les GUID standard ont une longueur d'exactement 16 octets.

Si vous devez le stocker sous forme de chaîne, la longueur dépend de la façon dont vous choisissez de l'encoder. En hexadécimal (alias codage en base 16) sans trait d'union, il y aurait 32 caractères (deux chiffres hexadécimaux par octet), soit char(32) .

Cependant, vous pourriez veulent pour stocker les traits d'union. Si vous manquez d'espace, mais que votre base de données ne prend pas en charge les blobs / guids de manière native, vous pouvez utiliser les éléments suivants Base64 et supprimez l'encodage == suffixe de remplissage ; cela vous donne 22 caractères, donc char(22) . Il n'est pas nécessaire d'utiliser l'Unicode, ni de disposer d'une longueur variable. nvarchar(max) serait un mauvais choix, par exemple.

1 votes

Pourquoi uniqueidentifer entièrement indexable mais binary(16) n'est pas ?

10voto

Ross Light Points 1994

Je crois que les GUID sont limités à une longueur de 16 octets (ou 32 octets pour un équivalent hexagonal ASCII).

7voto

cnd Points 94

Les GUID sont de 128 bits, ou

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)

Donc oui, au moins 20 caractères de long, ce qui revient en fait à gaspiller plus de 4,25 bits, de sorte que vous pouvez être tout aussi efficace en utilisant des bases plus petites que 95 également ; la base 85 étant la plus petite possible qui tient encore dans 20 caractères :

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

:-)

1 votes

En théorie, oui. Mais avec les énormes disques durs d'aujourd'hui, il est beaucoup plus pratique d'utiliser quelque chose comme varchar(50). Ainsi, si vous stockez quelque chose comme '1234ABC-ABCD-12AB-34CD-FEDCBA12', vous n'avez pas besoin de faire des allers-retours pour le traduire. Ce que vous suggérez est légèrement plus gourmand en ressources CPU que la simple lecture/écriture de la valeur, ce qui est ce que vous voulez en pratique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X