2009-06-09 19 views
261

Ich möchte eine Varchar-Spalte in SQL erstellen, die N'guid' enthalten sollte, während guid ist eine generierte GUID von .NET (Guid.NewGuid) - Klasse System.Guid.Was ist die String-Länge einer GUID?

Was ist die Länge der varchar Ich sollte von einer GUID erwarten? Ist es eine statische Länge?

Sollte ich nvarchar verwenden (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.NewGuid' hat keine implizite" String-Länge "; Alles hängt von dem Format ab, das in [ToString] (http://msdn.microsoft.com/en-us/library/97af8hh4.aspx) verwendet wird (das Argument "ToString" verwendet die Formatierung "D"). Ich bevorzuge "B", da es einfacher ist zu sehen, dass es eine GUID ist, aber das ist nur Vertrautheit und Konvention. –

+6

warum speichern Sie es nicht einfach als 16byte uniqueidentifier? –

Antwort

576

Es hängt davon ab, wie Sie die GUID-Format:

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

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

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

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

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

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

+1

@Shimmy - Schau dir die erste 'Hypenated, das gleiche wie Standard' – stevehipwell

+0

Ich habe keine Ahnung, was bedeutet, hyperated :( – Shimmy

+0

@Shimmy - Ein Hypen-Zeichen '-' wird verwendet, um die Gruppen zu trennen. – stevehipwell

53

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

12345678-1234-1234-1234-123456789012

, dass 36 Zeichen in jeder GUID ist - sie sind von konstanter Länge. Sie können ein wenig mehr über die Feinheiten von GUIDs here lesen.

Sie benötigen zwei weitere, wenn Sie die Klammern speichern möchten.

Hinweis: 36 ist die String-Länge mit den Bindestrichen dazwischen. Sie sind eigentlich 16-Byte-Nummern.

+1

Ich denke, eine Repräsentation umgibt mit {}, also würde das ein Maximum von 38 bedeuten. –

+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 Klammern zurück. –

+0

Danke für euch zwei, was ich brauche ist 36, ich sagte ich möchte Guid.NewGuid speichern. – Shimmy

8

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

21

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

Wenn Sie es als Zeichenfolge speichern müssen, hängt die Länge wirklich davon ab, wie Sie es verschlüsseln möchten. Als hex (AKA base-16 encoding) ohne Bindestriche wären es 32 Zeichen (zwei Hexadezimalziffern pro Byte), also char(32).

Sie könnten jedoch möchten, um die Bindestriche zu speichern. Wenn Sie wenig Platz haben, aber Ihre Datenbank Blobs/Guids nicht nativ unterstützt, können Sie Base64 encoding verwenden und das Padding-Suffix == entfernen; das gibt dir 22 Zeichen, also char(22). Es ist nicht notwendig, Unicode zu verwenden, und keine Notwendigkeit für variable Länge - so wäre nvarchar(max) zum Beispiel eine schlechte Wahl.

3

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 sein, das ist eigentlich mehr als 4 vergeudet.25 Bits, so können Sie genauso effizient mit kleineren Basen als 95 auch sein; Basis 85 ist die kleinstmögliche eine, die noch in 20 Zeichen passt:

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

:-)

1

22 Bytes, wenn Sie es tun, wie folgt:

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

Binärketten speichern Roh- Byte-Daten, während Zeichenketten Text speichern. Verwenden Sie Binärdaten beim Speichern von Hexadezimalwerten wie SID, GUID und so weiter. Der Datentyp uniqueidentifier enthält eine global eindeutige ID oder GUID. Dieser Wert wird abgeleitet, indem die NEWID() - Funktion einen Wert zurückgibt, der für alle Objekte eindeutig ist. Es wird als Binärwert gespeichert, aber es wird als Zeichenkette 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 

Betrifft: SQL Server Das folgende Beispiel zeigt die Tabelle cust mit einem Uniquedatentyp erzeugt und verwendet NEWID die Tabelle mit einem Standardwert zu füllen. Wenn Sie den Standardwert NEWID() zuweisen, weist jede neue und vorhandene Zeile einen eindeutigen Wert für die Spalte CustomerID auf.

-- 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