Domanda

Voglio creare una colonna varchar in SQL che deve contenere N'guid' mentre guid è un GUID generato da .NET (Guid.NewGuid) - Sistema di classe.Guid.

Qual è la lunghezza del varchar Mi aspettavo da un GUID?È statico lunghezza?

Devo usare nvarchar (sarà GUID mai utilizzare caratteri Unicode)?

varchar(Guid.Length)

PS.Non voglio utilizzare una riga di SQL guid tipo di dati.Sto solo chiedendo che cosa è Guid.MaxLength.

È stato utile?

Soluzione

Dipende da come si formatta il Guid:

  • Guid.NewGuid().ToString() => 36 caratteri (un trattino)
    uscite: 12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("D") => 36 caratteri (con trattino, stesso ToString())
    uscite: 12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("N") => 32 caratteri (solo cifre)
    uscite: 12345678123412341234123456789abc

  • Guid.NewGuid().ToString("B") => 38 caratteri (parentesi graffe)
    uscite: {12345678-1234-1234-1234-123456789abc}

  • Guid.NewGuid().ToString("P") => 38 caratteri (parentesi)
    uscite: (12345678-1234-1234-1234-123456789abc)

  • Guid.NewGuid().ToString("X") => 68 caratteri (esadecimale)
    uscite: {0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0x9a,0xbc}}

Altri suggerimenti

36, e il GUID utilizza solo 0-9A-F (esadecimale!).

12345678-1234-1234-1234-123456789012

Questo è 36 caratteri in ogni GUID - sono di lunghezza costante. Si può leggere un po 'di più circa la complessità del GUID qui .

Sarà necessario due in più di lunghezza, se si desidera memorizzare le parentesi graffe.

Nota: 36 è la lunghezza della stringa con i trattini in mezzo. Essi sono in realtà i numeri a 16 byte.

Il corretto cosa da fare qui è di conservarla come uniqueidentifier - questo è quindi completamente a fissaggio meccanico, etc.il database.La prossima opzione migliore sarebbe un binary(16) colonna:standard Guid sono esattamente 16 byte di lunghezza.

Se è necessario archiviare come una stringa, la lunghezza in realtà si tratta di come si sceglie di codificare.Come hex (AKA base 16 codifica) senza trattini sarebbe di 32 caratteri (due cifre esadecimali per byte), quindi char(32).

Tuttavia, si potrebbe vuoi per memorizzare i trattini.Se siete a corto di spazio, ma il database non supporta blob / guid nativamente, si potrebbe utilizzare Base64 codifica e rimuovere il == imbottitura suffisso;che ti da 22 caratteri, in modo che char(22).Non c'è bisogno di utilizzare Unicode, e non c'è bisogno per la lunghezza variabile - così nvarchar(max) non sarebbe una buona scelta, per esempio.

Credo GUID sono costretti a lunghezze di 16 byte (o 32 byte per un ASCII equivalente esadecimale).

GUID sono 128bits, o

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)

Quindi sì, numero minimo di 20 caratteri, che in realtà è sprecare più di 4,25 bit, in modo da poter essere altrettanto efficace utilizzando basi più piccole di 95 così; Base 85 essendo il più piccolo possibile che si adatta ancora in 20 caratteri:

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

: -)

22 byte, se lo si fa in questo modo:

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

stringhe binarie memorizzare dati grezzi byte, mentre il testo personaggio stringhe negozio. Utilizzare i dati binari quando memorizzare valori hexi decimali come SID, GUID e così via. Il tipo di dati uniqueidentifier contiene un identificatore univoco globale o GUID. Questo valore deriva utilizzando la funzione NEWID () per restituire un valore che è unico per tutti gli oggetti. E 'memorizzato come un valore binario, ma è visualizzato come una stringa di caratteri.

Ecco un esempio.

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

Si applica a: SQL Server L'esempio seguente crea la tabella Cust con un tipo di dati uniqueidentifier e utilizza NEWID per riempire il tavolo con un valore predefinito. Nell'assegnare il valore predefinito di NEWID (), ogni riga nuova ed esistente ha un valore unico per la colonna 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top