2009-06-09 8 views
261

Je veux créer une colonne varchar dans SQL qui doit contenir N'guid' tandis que guid est un GUID généré par .NET (Guid.NewGuid) - class System.Guid.Quelle est la longueur de chaîne d'un GUID?

Quelle est la longueur du varchar que je devrais attendre d'un GUID? Est-ce une longueur statique?

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

varchar(Guid.Length) 

PS. Je ne souhaite pas utiliser un type de données SQL Guid Guid. Je demande juste ce qui est Guid.MaxLength.

+1

Remarque: 'Guid.NewGuid' n'a pas de" longueur de chaîne "implicite; Tout dépend du format utilisé dans [ToString] (http://msdn.microsoft.com/fr-fr/library/97af8hh4.aspx) (Le format sans argument 'ToString' utilise le formatage" D "). Je préfère "B" car il est plus facile de "voir que c'est un GUID", mais c'est juste de la familiarité et de la convention. –

+6

pourquoi ne pas simplement l'enregistrer comme identificateur unique 16 bits? –

Répondre

576

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

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

  • Guid.NewGuid().ToString("D") => caractères (traits d'union, identique à ToString())
    sorties: 12345678-1234-1234-1234-123456789abc

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

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

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

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

+1

@Shimmy - Regardez le premier 'Hypenated, le même que par défaut' – stevehipwell

+0

Je n'ai aucune idée de ce que hypenated signifie :( – Shimmy

+0

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

53

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

12345678-1234-1234-1234-123456789012

C'est 36 caractères dans tous les GUID - ils sont de longueur constante. Vous pouvez lire un peu plus sur les subtilités des GUID here.

Vous aurez besoin de deux longueurs supplémentaires si vous souhaitez stocker les accolades.

Remarque: 36 est la longueur de la chaîne avec les tirets entre les deux. Ce sont en réalité des nombres de 16 octets.

+1

Je pense qu'une resprésentation entoure avec {}, ce qui signifierait un maximum de 38 –

+3

Je suis sûr que vous l'avez bien eu la première fois, Eric. guid.ToString() renvoie une chaîne de longueur 36, sans accolades. –

+0

Merci pour vous deux, ce dont j'ai besoin est de 36, j'ai dit que je veux stocker Guid.NewGuid. – Shimmy

8

Je crois que les GUID sont contraints à des longueurs de 16 octets (ou 32 octets pour un équivalent hexadécimal ASCII).

21

La correcte chose à faire ici est de le stocker sous forme uniqueidentifier - c'est alors entièrement indexable, etc. dans la base de données. La meilleure option serait une colonne binary(16): les GUID standard ont exactement 16 octets de longueur.

Si vous devez le stocker sous forme de chaîne, la durée dépend vraiment de la façon dont vous choisissez de l'encoder. En tant qu'hex (codage AKA base-16) sans traits d'union, il serait de 32 caractères (deux chiffres hexadécimaux par octet), donc char(32).

Cependant, vous pouvez vouloir pour stocker les tirets. Si vous manquez d'espace, mais que votre base de données ne prend pas en charge les blobs/guids en mode natif, vous pouvez utiliser le codage Base64 et supprimer le suffixe de remplissage ==; cela vous donne 22 caractères, donc char(22). Il n'est pas nécessaire d'utiliser Unicode, et pas besoin de longueur variable - donc nvarchar(max) serait un mauvais choix, par exemple.

3

GUIDs sont 128bits 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) 

Alors oui, min 20 caractères, ce qui gaspille réellement plus de 4.25 bits, donc vous pouvez être aussi efficace en utilisant des bases plus petites que 95; la base 85 étant le plus petit possible qui se glisse en 20 caractères:

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

:-)

1

22 octets, si vous le faites comme ceci:

System.Guid guid = System.Guid.NewGuid(); 
byte[] guidbytes = guid.ToByteArray(); 
string uuid = Convert.ToBase64String(guidbytes).Trim('='); 
0

Les chaînes binaires stockent RAW- octet de données, tandis que les chaînes de caractères stockent du texte. Utilisez des données binaires lors du stockage des valeurs hexi-décimales telles que SID, GUID et ainsi de suite. Le type de données uniqueidentifier contient un identificateur global unique ou GUID. Cette valeur est dérivée à l'aide de la fonction NEWID() pour renvoyer une valeur unique à tous les objets. Il est stocké en tant que valeur binaire mais il est affiché sous la forme d'une chaîne de caractères.

Voici un exemple.

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 

S'applique à: SQL Server L'exemple suivant crée la table Cust avec un type de données uniqueidentifier et utilise NEWID pour remplir le tableau avec une valeur par défaut. Lors de l'affectation de la valeur par défaut de NEWID(), chaque ligne nouvelle et existante a une valeur unique pour la colonne 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 
Questions connexes