Jaka jest długość ciągu identyfikatora GUID?

361

Chcę utworzyć kolumnę varchar w SQL, która powinna zawierać, N'guid'podczas gdy guidwygenerowany identyfikator GUID .NET ( Guid.NewGuid ) - klasa System.Guid.

Jakiej długości varcharpowinienem oczekiwać od GUID? Czy to długość statyczna?

Czy powinienem używać nvarchar(czy GUID kiedykolwiek użyje znaków Unicode)?

varchar(Guid.Length)

PS. Nie chcę używać typu danych guid wiersza SQL. Pytam tylko, co jest Guid.MaxLength.

Shimmy Weitzhandler
źródło
1
Uwaga: Guid.NewGuidnie ma niejawnej „długości łańcucha”; Wszystko zależy od formatu użytego w ToString (brak argumentu ToStringużywa formatowania „D”). Wolę „B”, ponieważ łatwiej jest „zobaczyć, że to GUID”, ale to tylko znajomość i konwencja.
8
dlaczego nie zapisać go jako 16-bajtowego unikalnego identyfikatora?
Filip Cornelissen

Odpowiedzi:

769

To zależy od tego, jak sformatujesz Guid:

  • Guid.NewGuid().ToString()=> 36 znaków (dzielony)
    :12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("D")=> 36 znaków (dzielony, taki sam jak ToString())
    wyświetla:12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("N")=> 32 znaki (tylko cyfry)
    :12345678123412341234123456789abc

  • Guid.NewGuid().ToString("B")=> 38 znaków (nawiasy klamrowe)
    :{12345678-1234-1234-1234-123456789abc}

  • Guid.NewGuid().ToString("P")=> 38 znaków (nawiasy)
    :(12345678-1234-1234-1234-123456789abc)

  • Guid.NewGuid().ToString("X")=> 68 znaków
    wyjściowych (szesnastkowy) :{0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0x9a,0xbc}}

stevehipwell
źródło
1
@Shimmy - Spójrz na pierwszy „Hypenated, the same as default”
stevehipwell
2
Och, to „Hyphen” z literą H (szukałem w słowniku i nie mogłem znaleźć łącznika) ... Dzięki
Shimmy Weitzhandler
24
Chciałbym dodać, że Guid jest 128-bitową liczbą całkowitą bez znaku. Możesz również zapisać go jako tablicę 16-bajtową byte[16].
Eric Falsken,
3
ps, istnieje inna opcja: Guid.NewGuid (). ToString ("X") => 68 znaków wyjściowych: {0x12345678,0x1234,0x1234, {0x12,0x23,0x12,0x34,0x56,0x78,0x9a, 0xbc}}
Filip Cornelissen
4
komentarz na temat „tylko cyfr” z opcją „N” jest nieco trudny! Powinieneś przeczytać go bez nawiasów klamrowych i łączników
Jowen,
63

36, a GUID użyje tylko 0-9A-F (szesnastkowo!).

12345678-1234-1234-1234-123456789012

To 36 znaków w dowolnym identyfikatorze GUID - mają one stałą długość. Możesz przeczytać więcej o zawiłościach GUID tutaj .

Będziesz potrzebował jeszcze dwóch długości, jeśli chcesz przechowywać aparaty ortodontyczne.

Uwaga: 36 to długość łańcucha z myślnikami pomiędzy nimi. W rzeczywistości są to 16-bajtowe liczby.

Eric
źródło
1
Myślę, że jedna reprezentacja otacza {}, więc oznaczałoby to maksymalnie 38
Mitch Wheat
3
Jestem pewien, że za pierwszym razem miałeś rację, Eric. guid.ToString () zwraca ciąg o długości 36, bez nawiasów klamrowych.
Michael Petrotta
Dziękuję wam, potrzebuję 36, powiedziałem, że chcę przechowywać Guida. Nowy Guid.
Shimmy Weitzhandler,
7
To jest złe dla .NET; masz tylko 36 znaków! Dostajesz nawiasy klamrowe (38 znaków) dla wizualizatora C #, ale nie w kodzie!
stevehipwell
Jestem pedantyczny, ale ostatnie 3 cyfry mogły być ABC. Naprawdę przegapiłeś tutaj okazję.
NH.
32

Poprawne rzeczą do zrobienia jest, aby zapisać go jako uniqueidentifier- to wtedy w pełni wiertła itp w bazie danych. Kolejną najlepszą opcją byłaby binary(16)kolumna: standardowe identyfikatory GUID mają długość dokładnie 16 bajtów.

Jeśli musisz zapisać go jako ciąg znaków, długość naprawdę sprowadza się do tego, jak zdecydujesz się go zakodować. Jako szesnastkowy (kodowanie AKA base-16) bez łączników będzie to 32 znaki (dwie cyfry szesnastkowe na bajt), więc char(32).

Jednakże, może chcesz przechowywać myślniki. Jeśli brakuje miejsca, ale baza danych nie obsługuje natywnie obiektów blob / guids, można użyć kodowania Base64 i usunąć ==sufiks dopełniania; co daje 22 znaki, więc char(22). Nie ma potrzeby używania Unicode ani zmiennej długości - więc nvarchar(max)na przykład byłby to zły wybór.

Marc Gravell
źródło
dlaczego jest w uniqueidentiferpełni indeksowany, ale binary(16)nie jest?
BaltoStar,
9

Uważam, że identyfikatory GUID są ograniczone do 16-bajtowych długości (lub 32 bajtów dla odpowiednika szesnastkowego ASCII).

Ross Light
źródło
5

Identyfikatory GUID to 128 bitów lub

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)

Tak więc, minimum 20 znaków, co w rzeczywistości marnuje więcej niż 4,25 bitów, więc możesz być równie wydajny, używając mniejszych baz niż 95; baza 85 jest najmniejszą możliwą, która wciąż mieści się w 20 znakach:

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

:-)

cnd
źródło
Teoretycznie tak. Ale przy dzisiejszych ogromnych dyskach twardych znacznie bardziej praktyczne jest użycie czegoś takiego jak varchar (50). Jeśli więc przechowujesz coś w rodzaju „1234ABC-ABCD-12AB-34CD-FEDCBA12”, nie musisz w kółko tłumaczyć. To, co sugerujesz, wymaga nieco więcej procesora niż tylko odczytywanie / zapisywanie wartości, czego w praktyce chcesz.
LongChalk
3

22 bajty, jeśli zrobisz to w ten sposób:

System.Guid guid = System.Guid.NewGuid();
byte[] guidbytes = guid.ToByteArray();
string uuid = Convert.ToBase64String(guidbytes).Trim('=');
Qodex
źródło
0

Ciągi binarne przechowują dane nieprzetworzone, podczas gdy ciągi znaków przechowują tekst. Korzystać z danych binarnych podczas przechowywania wartości Hexi-dziesiętne, takich jak SID, GUIDi tak dalej. Typ danych Uniqueidentifier zawiera globalnie unikalny identyfikator lub identyfikator GUID. Ta wartość jest uzyskiwana za pomocą funkcji NEWID () w celu zwrócenia wartości unikalnej dla wszystkich obiektów. Jest przechowywany jako wartość binarna, ale jest wyświetlany jako ciąg znaków.

Oto przykład.

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

Dotyczy: SQL Server Poniższy przykład tworzy tabelę klienta z typem danych unikatowy identyfikator i używa NEWID do wypełnienia tabeli wartością domyślną. Przypisując domyślną wartość NEWID (), każdy nowy i istniejący wiersz ma unikalną wartość dla kolumny 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
Łowca
źródło
Nieco bardziej preferowane jest użycie dodatkowego identyfikatora int tożsamości (1,1) KLUCZ PODSTAWOWY Tabela bez klucza podstawowego powoduje problemy. Załóżmy, że masz milion klientów i chcesz mieć jedną linię - GDZIE CustomerID = 'xxx' - chcesz zeskanować cały stół lub wyszukać go bezpośrednio? To podwójne wyszukiwanie - ID = 524332 i CustomerID = 'xxx' jest bardzo silnym wyszukiwaniem. Jest zarówno bardzo szybki, jak i bardzo bezpieczny (nikt nie może odgadnąć GUID z brutalną siłą).
LongChalk