Frage

Ich möchte eine Varchar -Spalte in SQL erstellen, die enthalten sollte N'guid' während guid ist eine generierte GUID von .NET (Guid.Newguid) - Klassensystem.guid.

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

Sollte ich es benutzen nvarchar (Wird Guid jemals Unicode -Zeichen verwenden)?

varchar(Guid.Length)

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

War es hilfreich?

Lösung

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

  • Guid.NewGuid().ToString() => 36 Charaktere (beigebracht)
    Ausgänge: 12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("D") => 36 Charaktere (beigebracht, wie 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 (Zahnspangen)
    Ausgänge: {12345678-1234-1234-1234-123456789abc}

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

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

Andere Tipps

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

12345678-1234-1234-1234-123456789012

Das sind 36 Zeichen in jeder Richtlinie-sie sind von ständiger Länge. Sie können ein bisschen mehr über die Feinheiten von Guids lesen hier.

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

HINWEIS: 36 ist die Stringlänge mit den Strichen dazwischen. Sie sind tatsächlich 16-Byte-Zahlen.

Das Korrekt Hier ist es, es zu speichern als uniqueidentifier - Dies ist dann vollständig indexierbar usw. in der Datenbank. Die nächstbeste Option wäre a binary(16) Spalte: Standardguids sind genau 16 Bytes lang.

Wenn Sie es als Zeichenfolge speichern müssen, kommt es wirklich darauf an, wie Sie es codieren. Als Hex (auch bekannt als Basis-16-Codierung) ohne Bindestriche wären es 32 Zeichen (zwei Sechskantigstellen pro Byte), also char(32).

Sie könnten jedoch möglicherweise wollen die Bindestriche aufbewahren. Wenn Sie nicht im Raum sind, Ihre Datenbank jedoch nicht nativ Blobs / Richtlinien unterstützt, können Sie verwenden Basis64 codieren und entfernen die == Padding -Suffix; Das gibt dir 22 Zeichen, also char(22). Es besteht keine Notwendigkeit, Unicode zu verwenden, und es ist keine Notwendigkeit für variable Länge - also nvarchar(max) Wäre zum Beispiel eine schlechte Wahl.

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

GUIDs are 128bits, or

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)

So yes, min 20 characters long, which is actually wasting more than 4.25 bits, so you can be just as efficient using smaller bases than 95 as well; base 85 being the smallest possible one that still fits into 20 chars:

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

:-)

22 bytes, if you do it like this:

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

Binary strings store raw-byte data, whilst character strings store text. Use binary data when storing hexi-decimal values such as SID, GUID and so on. The uniqueidentifier data type contains a globally unique identifier, or GUID. This value is derived by using the NEWID() function to return a value that is unique to all objects. It's stored as a binary value but it is displayed as a character string.

Here is an example.

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

Applies to: SQL Server The following example creates the cust table with a uniqueidentifier data type, and uses NEWID to fill the table with a default value. In assigning the default value of NEWID(), each new and existing row has a unique value for the CustomerID column.

-- 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top