Ich möchte eine Varchar-Spalte in SQL erstellen, die enthalten sollte, N'guid'
während guid
eine von .NET ( Guid.NewGuid ) generierte GUID- Klasse System.Guid generiert wird.
Wie lang varchar
sollte 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
.
Guid.NewGuid
hat keine implizite "Zeichenfolgenlänge"; Es hängt alles vom Format ab, das im ToString verwendet wird (das No-ArgumentToString
verwendet 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.Antworten:
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, wieToString()
)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}}
quelle
byte[16]
.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.
quelle
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 einebinary(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 Zeichenchar(22)
. Es ist nicht erforderlich, Unicode zu verwenden, und es ist keine variable Länge erforderlich - diesnvarchar(max)
wäre beispielsweise eine schlechte Wahl.quelle
uniqueidentifer
vollständig indizierbar, aberbinary(16)
nicht?Ich glaube, GUIDs sind auf 16-Byte-Längen beschränkt (oder 32 Byte für ein ASCII-Hex-Äquivalent).
quelle
GUIDs sind 128 Bit oder
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:
:-)
quelle
22 Bytes, wenn Sie es so machen:
quelle
Binäre Zeichenfolgen speichern Rohbyte-Daten, während Zeichenfolgen Text speichern. Verwenden von Binärdaten , wenn hexi-Dezimalwerte wie Speicher
SID
,GUID
und 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.
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.
quelle