Chcę utworzyć kolumnę varchar w SQL, która powinna zawierać, N'guid'
podczas gdy guid
wygenerowany identyfikator GUID .NET ( Guid.NewGuid ) - klasa System.Guid.
Jakiej długości varchar
powinienem 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
.
Guid.NewGuid
nie ma niejawnej „długości łańcucha”; Wszystko zależy od formatu użytego w ToString (brak argumentuToString
używa formatowania „D”). Wolę „B”, ponieważ łatwiej jest „zobaczyć, że to GUID”, ale to tylko znajomość i konwencja.Odpowiedzi:
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 jakToString()
)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ówwyjściowych (szesnastkowy) :
{0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0x9a,0xbc}}
źródło
byte[16]
.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.
źródło
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łabybinary(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ęcchar(22)
. Nie ma potrzeby używania Unicode ani zmiennej długości - więcnvarchar(max)
na przykład byłby to zły wybór.źródło
uniqueidentifer
pełni indeksowany, alebinary(16)
nie jest?Uważam, że identyfikatory GUID są ograniczone do 16-bajtowych długości (lub 32 bajtów dla odpowiednika szesnastkowego ASCII).
źródło
Identyfikatory GUID to 128 bitów lub
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:
:-)
źródło
22 bajty, jeśli zrobisz to w ten sposób:
źródło
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
,GUID
i 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.
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.
źródło