Jaka jest długość łańcucha GUID?

Chcę utworzyć kolumnę varchar w SQL, która powinna zawierać N'guid' podczas gdy guidjest generowanym GUID przez.Net ( Guid.NewGuid ) - system klasy.Guid.

Jakiej długości varchar powinienem się spodziewać po GUID? Czy to długość statyczna?

Czy powinienem używać nvarchar (czy GUID będzie używał znaków Unicode)?

varchar(Guid.Length)

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

Author: Peter Mortensen, 2009-06-09

7 answers

To zależy od tego, jak sformatujesz Guid:

  • Guid.NewGuid().ToString() => 36 znaki (dzielone)
    wyniki: 12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("D") => 36 znaki (dzielone, takie same jak ToString())
    wyniki: 12345678-1234-1234-1234-123456789abc

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

  • Guid.NewGuid().ToString("B") => 38 znaki (Szelki)
    wyniki: {12345678-1234-1234-1234-123456789abc}

  • Guid.NewGuid().ToString("P") => 38 postacie (Nawiasy)
    wyniki: (12345678-1234-1234-1234-123456789abc)

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

 627
Author: stevehipwell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-31 11:26:12

36, a GUID będzie używał tylko 0-9A-F (hexidecimal!).

12345678-1234-1234-1234-123456789012

To 36 znaków w każdym GUID-są stałej długości. Więcej o zawiłościach GUIDs przeczytasz tutaj.

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

Uwaga: 36 to Długość łańcucha z myślnikami pomiędzy. Są to liczby 16-bajtowe.

 56
Author: Eric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-17 04:13:11

poprawne należy tutaj zapisać jako uniqueidentifier - jest to wtedy w pełni indeksowalne itp. w bazie danych. Kolejną najlepszą opcją będzie kolumna binary(16): Standardowe identyfikatory GUID mają dokładnie 16 bajtów długości.

Jeśli musisz przechowywać go jako ciąg znaków, długość naprawdę sprowadza się do tego, jak chcesz go zakodować. Ponieważ kodowanie szesnastkowe (AKA kodowanie bazowe-16) BEZ myślników byłoby 32 znaki (dwie cyfry szesnastkowe na bajt), więc char(32).

Jednak możesz chcieć przechowywać myślniki. Jeśli brakuje Ci miejsca, ale twoja baza danych nie obsługuje obiektów blob / GUID natywnie, możesz użyć kodowania Base64 i usunąć przyrostek == padding; który daje 22 znaki, więc char(22). Nie ma potrzeby używania Unicode i nie ma potrzeby stosowania zmiennej długości-więc nvarchar(max) byłoby złym wyborem, na przykład.

 24
Author: Marc Gravell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-14 07:59:21

Uważam, że GUID są ograniczone do 16-bajtowych długości (lub 32 bajty dla ASCII hex równoważne).

 8
Author: Ross Light,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-09 04:47:35

GUID to 128bits, czyli

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)

Więc tak, min 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 nadal mieści się w 20 znakach:

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

:-)

 4
Author: cnd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-29 04:02:09

22 bajty, jeśli zrobisz to tak:

System.Guid guid = System.Guid.NewGuid();
byte[] guidbytes = guid.ToByteArray();
string uuid = Convert.ToBase64String(guidbytes).Trim('=');
 2
Author: Qodex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-19 21:43:36

Ciągi binarne przechowują dane RAW-bajtów, podczas gdy ciągi znaków przechowują tekst. Używaj danych binarnych podczas przechowywania wartości heksowo-dziesiętnych, takich jak SID, GUID i tak dalej. Typ danych uniqueidentifier zawiera globalnie unikalny identyfikator lub GUID. To wartość jest uzyskiwana za pomocą funkcji nevid (), aby zwrócić wartość unikalną dla wszystkich obiektów. Jest przechowywana jako wartość binarna, ale jest wyświetlana 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 Na poniższy przykład tworzy tabelę cust z typem danych uniqueidentifier i używa nevid do wypełnienia tabeli wartością domyślną. Przypisując domyślną wartość nevid(), 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
 0
Author: Hunter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-07 14:55:45