481 Stimmen

Was ist die Stringlänge einer GUID?

Ich möchte eine varchar-Spalte in SQL erstellen, die Folgendes enthalten soll N'guid' während guid ist eine von .NET generierte GUID ( Guid.NewGuid ) - Klasse System.Guid.

Wie lang ist die varchar die ich von einer GUID erwarten sollte? Ist es eine statische Länge?

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

varchar(Guid.Length)

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

1 Stimmen

Anmerkung: Guid.NewGuid hat keine implizite "Stringlänge"; alles hängt von dem Format ab, das in der ToString (Das Nicht-Argument ToString verwendet die Formatierung "D"). Ich bevorzuge "B", da es einfacher ist, "zu sehen, dass es eine GUID ist", aber das ist nur Gewohnheit und Konvention.

12 Stimmen

Warum nicht einfach als 16 Byte große eindeutige Kennung speichern?

1025voto

stevehipwell Punkte 52558

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

  • Guid.NewGuid().ToString() = 36 Zeichen (mit Bindestrich)
    Ausgänge: 12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("D") = 36 Zeichen (mit Bindestrich, wie bei ToString() )
    Ausgänge: 12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("N") = 32 Zeichen (nur Ziffern)
    Ausgänge: 12345678123412341234123456789abc

  • Guid.NewGuid().ToString("B") = 38 Zeichen (Klammern)
    Ausgänge: {12345678-1234-1234-1234-123456789abc}

  • Guid.NewGuid().ToString("P") = 38 Zeichen (in Klammern)
    Ausgänge: (12345678-1234-1234-1234-123456789abc)

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

80voto

Eric Punkte 87889

36, und die GUID wird nur 0-9A-F (hexidezimal!) verwenden.

12345678-1234-1234-1234-123456789012

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

Sie benötigen zwei weitere in der Länge, wenn Sie die Hosenträger aufbewahren wollen.

Hinweis: 36 ist die Länge der Zeichenfolge mit den Bindestrichen dazwischen. Sie sind eigentlich 16-Byte-Zahlen.

45voto

Marc Gravell Punkte 970173

En richtig Hier ist es sinnvoll, sie als uniqueidentifier - diese ist dann vollständig indizierbar usw. in der Datenbank. Die nächstbeste Option wäre eine binary(16) Spalte: Standard-GUIDs sind genau 16 Byte lang.

Wenn Sie sie als Zeichenkette speichern müssen, hängt die Länge wirklich davon ab, wie Sie sie kodieren wollen. In hexadezimaler Kodierung (auch Base-16-Kodierung genannt) ohne Bindestriche wären es 32 Zeichen (zwei Hex-Ziffern pro Byte), also char(32) .

Sie könnten jedoch wollen um die Bindestriche zu speichern. Wenn Sie wenig Platz haben, aber Ihre Datenbank Blobs/Guids nicht nativ unterstützt, können Sie Folgendes verwenden Base64 Kodierung und entfernen Sie die == Auffüllsuffix; damit haben Sie 22 Zeichen, also char(22) . Es besteht keine Notwendigkeit, Unicode zu verwenden, und keine Notwendigkeit für variable Länge - also nvarchar(max) wäre zum Beispiel eine schlechte Wahl.

9voto

Ross Light Punkte 4113

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

6voto

cnd Punkte 1639

GUIDs sind 128bits 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 Bits verschwendet, so dass man genauso effizient sein kann, wenn man kleinere Basen als 95 verwendet; 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)

:-)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X