2009-06-09 22 views
261

Quiero crear una columna varchar en SQL que debe contener N'guid', mientras que guid es un GUID generado por .NET (Guid.NewGuid) - clase System.Guid.¿Cuál es la longitud de cadena de un GUID?

¿Cuál es la longitud del varchar que debería esperar de un GUID? ¿Es una longitud estática?

¿Debo usar nvarchar (el GUID siempre utilizará caracteres Unicode)?

varchar(Guid.Length) 

PS. No quiero utilizar un tipo de datos SQL guid row. Solo estoy preguntando qué es Guid.MaxLength.

+1

Nota: 'Guid.NewGuid' no tiene una" longitud de cadena "implícita; Todo depende del formato utilizado en [ToString] (http://msdn.microsoft.com/en-us/library/97af8hh4.aspx) (El no-argumento 'ToString' utiliza el formato" D "). Prefiero "B" ya que es más fácil "ver que es un GUID", pero eso es solo familiaridad y convención. –

+6

¿por qué no solo guardarlo como un identificador único de 16 bytes? –

Respuesta

576

Depende de cómo se formatea el Guid:

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

  • Guid.NewGuid().ToString("D") => caracteres (con guiones, igual que ToString())
    salidas: 12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("N") => caracteres (dígitos solamente)
    salidas: 12345678123412341234123456789abc

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

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

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

+1

@Shimmy - Mira el primero 'Hypenated, lo mismo que el predeterminado' – stevehipwell

+0

No tengo ni idea de qué significa hipenato :( – Shimmy

+0

@Shimmy - Un carácter hypen '-' se usa para separar los grupos. – stevehipwell

53

36, y el GUID solo usará 0-9A-F (¡hexadecimal!).

12345678-1234-1234-1234-123456789012

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

Necesitará dos más de longitud si desea almacenar las llaves.

Nota: 36 es la longitud de la cadena con los guiones intermedios. En realidad son números de 16 bytes.

+1

Creo que una representación se rodea con {}, por lo que significaría un máximo de 38 –

+3

Estoy bastante seguro de que lo hiciste bien la primera vez, Eric. guid.ToString() devuelve una cadena de longitud 36, sin llaves. –

+0

Gracias por ustedes dos, lo que necesitaré es 36, dije que quería almacenar Guid.NewGuid. – Shimmy

8

Creo que los GUID están limitados a longitudes de 16 bytes (o 32 bytes para un equivalente hexadecimal ASCII).

21

El correcta que hay que hacer aquí es para almacenarla como uniqueidentifier - esto es entonces completamente indexable, etc. en la base de datos. La siguiente mejor opción sería una columna binary(16): los GUID estándar tienen exactamente 16 bytes de longitud.

Si debe almacenarlo como una cadena, la longitud realmente depende de cómo elija codificarla. Como hex (codificación AKA base-16) sin guiones, tendría 32 caracteres (dos dígitos hexadecibles por byte), por lo que char(32).

Sin embargo, puede querer para almacenar los guiones. Si tiene poco espacio, pero su base de datos no admite blobs/guids de forma nativa, puede usar la codificación Base64 y eliminar el sufijo de relleno ==; eso le da 22 caracteres, entonces char(22). No es necesario utilizar Unicode ni la necesidad de longitud variable, por lo que nvarchar(max) sería una mala elección, por ejemplo.

3

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í, mínimo 20 caracteres de longitud, que en realidad está desperdiciando más de 4.25 bits, por lo que puede ser igual de eficiente usando bases más pequeñas que 95 también; la base 85 es el más pequeño posible que todavía se ajusta a 20 caracteres:

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

:-)

1

22 bytes, si lo haces de esta manera: almacenar

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

cadenas binarias RAW- datos de bytes, mientras que las cadenas de caracteres almacenan texto. Use datos binarios cuando almacene valores hexadecimales como SID, GUID, etc. El tipo de datos uniqueidentifier contiene un identificador único global, o GUID. Este valor de se obtiene al usar 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.

Aquí hay 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 

artículo se refiere a: Servidor SQL el siguiente ejemplo se 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 predeterminado 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 
Cuestiones relacionadas