Was ist die Stringlänge einer GUID?


361

Ich möchte eine Varchar-Spalte in SQL erstellen, die enthalten sollte, N'guid'während guideine von .NET ( Guid.NewGuid ) generierte GUID- Klasse System.Guid generiert wird.

Wie lang varcharsollte ich von einer GUID erwarten? Ist es eine statische Länge?

Sollte ich verwenden nvarchar(wird GUID jemals Unicode-Zeichen verwenden)?

varchar(Guid.Length)

PS. Ich möchte keinen SQL-Zeilen-Guid-Datentyp verwenden. Ich frage nur, was ist Guid.MaxLength.


1
Hinweis: Guid.NewGuidhat keine implizite "Zeichenfolgenlänge"; Es hängt alles vom Format ab, das im ToString verwendet wird (das No-Argument ToStringverwendet die Formatierung "D"). Ich bevorzuge "B", da es einfacher ist, "zu erkennen, dass es sich um eine GUID handelt", aber das ist nur Vertrautheit und Konvention.

8
Warum nicht einfach als 16-Byte-eindeutige Kennung speichern?
Filip Cornelissen

Antworten:


769

Dies hängt davon ab, wie Sie die Guid formatieren:

  • Guid.NewGuid().ToString()=> 36 Zeichen (mit Bindestrich)
    ausgegeben:12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("D")=> 36 Zeichen (getrennt, wie ToString())
    Ausgaben:12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("N")=> 32 Zeichen (nur Ziffern)
    Ausgaben:12345678123412341234123456789abc

  • Guid.NewGuid().ToString("B")=> 38 Zeichen (geschweifte Klammern) geben aus
    :{12345678-1234-1234-1234-123456789abc}

  • Guid.NewGuid().ToString("P")=> 38 Zeichen (Klammern)
    gibt aus:(12345678-1234-1234-1234-123456789abc)

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


1
@ Shimmy - Schauen Sie sich die erste "Hypenated, das gleiche wie Standard"
stevehipwell

2
Oh, dann ist es 'Bindestrich' mit einem H (ich habe im Wörterbuch gesucht und konnte keinen Bindestrich finden) ... Danke
Shimmy Weitzhandler

24
Ich möchte hinzufügen, dass ein Guid eine 128-Bit-Ganzzahl ohne Vorzeichen ist. Sie können es auch als 16-Byte-Array speichern byte[16].
Eric Falsken

3
ps, es gibt noch eine andere Option: Guid.NewGuid (). ToString ("X") => 68 Zeichenausgabe: {0x12345678,0x1234,0x1234, {0x12,0x23,0x12,0x34,0x56,0x78,0x9a, 0xbc}}
Filip Cornelissen

4
Der Kommentar zu 'nur Ziffern' mit der Option "N" ist etwas knifflig! Sie sollten es wie ohne Klammern und Bindestriche lesen
Jowen

63

36, und die GUID verwendet nur 0-9A-F (hexadezimal!).

12345678-1234-1234-1234-123456789012

Das sind 36 Zeichen in jeder GUID - sie sind von konstanter Länge. Sie können ein bisschen mehr über die Feinheiten der GUIDs lesen hier .

Sie benötigen zwei weitere in der Länge, wenn Sie die Zahnspangen aufbewahren möchten.

Hinweis: 36 ist die Zeichenfolgenlänge mit den Bindestrichen dazwischen. Sie sind tatsächlich 16-Byte-Zahlen.


1
Ich denke, eine Darstellung umgibt mit {}, das würde also ein Maximum von 38 bedeuten
Mitch Wheat

3
Ich bin mir ziemlich sicher, dass du es beim ersten Mal richtig gemacht hast, Eric. guid.ToString () gibt eine Zeichenfolge der Länge 36 ohne geschweifte Klammern zurück.
Michael Petrotta

Vielen Dank für euch beide, ich brauche 36, ich sagte, ich möchte Guid.NewGuid speichern.
Shimmy Weitzhandler

7
Dies ist für .NET falsch. Sie erhalten nur 36 Zeichen! Sie erhalten die geschweiften Klammern (38 Zeichen) für den C # -Visualizer, jedoch nicht im Code!
Stevehipwell

Ich bin pedantisch, aber die letzten 3 Ziffern könnten ABC gewesen sein. Sie haben hier wirklich eine Gelegenheit verpasst.
NH.

32

Das richtige , was hier zu tun ist , es zu speichern , wie uniqueidentifier- diese dann vollständig Wende ist, usw. in der Datenbank. Die nächstbeste Option wäre eine binary(16)Spalte: Standard-GUIDs sind genau 16 Byte lang.

Wenn Sie es als Zeichenfolge speichern müssen, hängt die Länge davon ab, wie Sie es codieren. Als Hex (AKA Base-16-Codierung) ohne Bindestriche wären es 32 Zeichen (zwei Hex-Ziffern pro Byte) char(32).

Möglicherweise möchten Sie jedoch die Bindestriche speichern. Wenn Sie wenig Speicherplatz haben, Ihre Datenbank jedoch Blobs / Guids nicht nativ unterstützt, können Sie die Base64- Codierung verwenden und das ==Auffüllsuffix entfernen . das gibt dir also 22 Zeichen char(22). Es ist nicht erforderlich, Unicode zu verwenden, und es ist keine variable Länge erforderlich - dies nvarchar(max)wäre beispielsweise eine schlechte Wahl.


Warum ist es uniqueidentifervollständig indizierbar, aber binary(16)nicht?
BaltoStar

9

Ich glaube, GUIDs sind auf 16-Byte-Längen beschränkt (oder 32 Byte für ein ASCII-Hex-Äquivalent).


5

GUIDs sind 128 Bit oder

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)

Also ja, mindestens 20 Zeichen lang, was tatsächlich mehr als 4,25 Bit verschwendet, sodass Sie auch mit kleineren Basen als 95 genauso effizient sein können. Basis 85 ist die kleinstmögliche, die noch in 20 Zeichen passt:

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

:-)


Theoretisch ja. Aber mit den riesigen Festplatten von heute ist es viel praktischer, so etwas wie varchar (50) zu verwenden. Wenn Sie also etwas wie '1234ABC-ABCD-12AB-34CD-FEDCBA12' speichern, müssen Sie bei der Übersetzung nicht hin und her gehen. Was Sie vorschlagen, ist etwas CPU-intensiver als nur das Lesen / Schreiben des Werts, was Sie in der Praxis wollen.
LongChalk

3

22 Bytes, wenn Sie es so machen:

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

0

Binäre Zeichenfolgen speichern Rohbyte-Daten, während Zeichenfolgen Text speichern. Verwenden von Binärdaten , wenn hexi-Dezimalwerte wie Speicher SID, GUIDund so weiter. Der Datentyp der eindeutigen Kennung enthält eine global eindeutige Kennung oder GUID. Dieser Wert wird mithilfe der Funktion NEWID () abgeleitet, um einen Wert zurückzugeben, der für alle Objekte eindeutig ist. Es wird als Binärwert gespeichert, aber als Zeichenfolge angezeigt.

Hier ist ein Beispiel.

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

Gilt für: SQL Server Im folgenden Beispiel wird die cust-Tabelle mit einem Datentyp mit eindeutiger Kennung erstellt und mit NEWID die Tabelle mit einem Standardwert gefüllt. Beim Zuweisen des Standardwerts von NEWID () hat jede neue und vorhandene Zeile einen eindeutigen Wert für die Spalte 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

Etwas bevorzugter ist die Verwendung einer zusätzlichen ID int identity (1,1) PRIMARY KEY Eine Tabelle ohne Primärschlüssel führt zu Problemen. Angenommen, Sie haben eine Million Kunden und möchten eine einzelne Zeile - WHERE CustomerID = 'xxx' - möchten Sie die gesamte Tabelle scannen oder direkt suchen? Diese doppelte Suche - ID = 524332 und CustomerID = 'xxx' ist eine sehr starke Suche. Es ist sowohl sehr schnell als auch sehr sicher (niemand kann eine GUID mit roher Gewalt erraten).
LongChalk
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.