DÉSACTIVER ADBLOCK

ADBlock bloque du contenu sur le site

ADBlock errore

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

StackOverflow https://stackoverflow.com/questions/968175

Question

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

Quelle est la longueur de la varchar j'attendre d'un GUID? Est-ce une longueur statique?

Dois-je utiliser nvarchar (GUID sera jamais utiliser des caractères Unicode)?

varchar(Guid.Length)

PS. Je ne veux pas utiliser une ligne de SQL guid type de données. Je vous demande simplement ce qui est Guid.MaxLength.

Solution

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

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

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

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

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

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

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

AUTRES CONSEILS

36, et le GUID n'utilisera 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 de GUIDs .

Vous aurez besoin de deux plus long si vous voulez stocker les accolades.

Note: 36 est la longueur de chaîne avec les tirets entre les deux. Ils sont en fait des nombres de 16 octets.

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

Si vous devez stocker sous forme de chaîne, la longueur est vraiment à la façon dont vous choisissez de le coder. Comme hex (AKA base 16 codage) sans trait d'union, il serait de 32 caractères (deux chiffres hexadécimaux par octet), de sorte que char(32).

Cependant, vous pouvez voulez pour stocker les traits d'union. Si vous êtes à court d'espace, mais la base de données ne supporte pas nativement blobs / GUIDs, vous pouvez utiliser l'encodage base64 et de supprimer le suffixe de rembourrage ==; qui vous donne 22 caractères, donc char(22). Il n'y a pas besoin d'utiliser Unicode, et pas besoin de longueur variable -. Donc nvarchar(max) serait un mauvais choix, par exemple

Je crois GUID sont limités à des longueurs de 16 octets (ou 32 octets pour un hexagone ASCII équivalent).

sont GUIDs 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 de sorte que vous pouvez être tout aussi efficace en utilisant des bases plus petites que 95 ainsi; 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)

: -)

22 octets, si vous le faites comme ceci:

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

Les chaînes binaires stockent les données octet brutes, tandis que le texte de chaînes de caractères magasin. Utiliser des données binaires lors de l'enregistrement des valeurs décimales hexi tels que SID, GUID et ainsi de suite. Le type de données uniqueidentifier contient un identificateur global unique, ou GUID. Cette La valeur est obtenue en utilisant la fonction NEWID () pour renvoyer une valeur qui est unique pour 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. En attribuant la valeur par défaut de NEWID (), chaque ligne nouveaux et existants 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