DISABLE ADBLOCK

ADBlock está bloqueando parte del contenido en el sitio

ADBlock errore

¿Cuál es la longitud de cadena de un GUID?

StackOverflow https://stackoverflow.com/questions/968175

Pregunta

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

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

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

varchar(Guid.Length)

PS. No quiero utilizar una fila de SQL GUID de tipo de datos. Estoy preguntando ¿cuál es Guid.MaxLength.

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 correcta que hay que hacer aquí es para almacenarla como uniqueidentifier - esto es entonces totalmente indexable, etc., en la base de datos. La siguiente mejor opción sería una columna binary(16):. GUID estándar son exactamente 16 bytes de longitud

Si debe almacenar como una cadena, la longitud realmente se reduce a la forma que elija para codificarla. Como hex (AKA en base 16 de codificación) sin guiones sería de 32 caracteres (dos dígitos hexadecimales por byte), por lo char(32).

Sin embargo, es posible que que desee para almacenar los guiones. Si usted es corto el espacio, pero su base de datos no es compatible con BLOB / guids forma nativa, puede utilizar la codificación Base64 y quitar el sufijo relleno ==; que le da 22 caracteres, por lo char(22). No hay necesidad de utilizar Unicode, y sin necesidad de longitud variable -. nvarchar(max) modo sería una mala elecció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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow