Pregunta

Quiero crear una columna varchar en SQL que debe contener N'guid' mientras guid es un GUID generado por .NET (Guid.NewGuid) - Sistema de la clase.Guid.

¿Cuál es la longitud de la varchar Que debo esperar de un GUID?Es un conjunto estático de longitud?

Debo usar nvarchar (se GUID nunca utilizar caracteres Unicode)?

varchar(Guid.Length)

PS.No quiero usar un SQL fila de datos guid-tipo.Sólo estoy preguntando qué es Guid.MaxLength.

¿Fue útil?

Solución

Depende de cómo se formatea el GUID:

  • Guid.NewGuid().ToString() => 36 caracteres (con guión)
    Salidas: 12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("D") => 36 caracteres (con guión, mismo que ToString())
    Salidas: 12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("N") => 32 caracteres (sólo dígitos) guía Salidas: 12345678123412341234123456789abc

  • Guid.NewGuid().ToString("B") => 38 caracteres (Braces)
    Salidas: {12345678-1234-1234-1234-123456789abc}

  • Guid.NewGuid().ToString("P") => 38 caracteres (paréntesis)
    Salidas: (12345678-1234-1234-1234-123456789abc)

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

Otros consejos

36, y el GUID sólo utilizará 0-9A-F (hexadecimal).

12345678-1234-1234-1234-123456789012

Eso es 36 caracteres en cualquier GUID - que son de longitud constante. Usted puede leer un poco más sobre las complejidades de los GUID aquí .

Usted necesitará dos más en longitud si desea almacenar las llaves.

Nota: 36 es la longitud de cadena con las rayas en el medio. En realidad son números de 16 bytes.

El correcto cosa que hacer aquí es para guardarlo como uniqueidentifier - esto es totalmente intercambiables, etc.en la base de datos.La siguiente mejor opción sería un binary(16) columna:estándar Guid son exactamente 16 bytes de longitud.

Si debe almacenar una cadena de texto, la longitud realmente depende de lo que usted elija para codificar.Como hex (AKA base 16 de la codificación) sin guiones sería de 32 caracteres (dos dígitos hexadecimales por byte), por lo que char(32).

Sin embargo, usted puede quiero para almacenar los guiones.Si usted es corto el espacio, pero su base de datos no admite blobs / guid de forma nativa, podría utilizar Base64 codificación y quitar la == relleno sufijo;que le da 22 caracteres, por lo que char(22).No es necesario el uso de Unicode, y sin necesidad de longitud variable - así nvarchar(max) sería una mala opción, por ejemplo.

Creo GUID están limitadas a longitudes de 16 bytes (o 32 bytes para un equivalente hex ASCII).

GUID son 128 bits, o

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)

Así que sí, min 20 caracteres de largo, que en realidad está desperdiciando más de 4,25 bits, por lo que puede ser tan eficiente utilizando bases más pequeñas que 95 así; de base 85 siendo la más pequeña posible que todavía encaja en 20 caracteres:

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

: -)

22 bytes, si lo haces de esta manera:

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

Las series binarias almacenar datos de un byte en bruto, mientras que el texto cadenas de tienda de personajes. Utilizar datos binarios cuando Hexi almacenar valores decimales como SID, GUID y así sucesivamente. El tipo de datos uniqueidentifier contiene un identificador único global, o GUID. Esta valor se deriva utilizando la función NEWID () para devolver un valor que es único para todos los objetos. Se almacena como un valor binario pero se muestra como una cadena de caracteres.

Este es un ejemplo.

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

Se aplica a: SQL Server El siguiente ejemplo crea la tabla Cust con un tipo de datos uniqueidentifier, y utiliza NEWID para llenar la mesa con un valor por defecto. Al asignar el valor por defecto de NEWID (), cada fila nueva y existente tiene un valor único para la columna 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top