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


Quiero crear una columna varchar en SQL que debería contener N'guid' mientras que guid es un GUID generado por.NET ( Guid.NewGuid ) - sistema de clases.Guid.

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

¿Debo usar nvarchar (GUID usará alguna vez caracteres Unicode)?

varchar(Guid.Length)

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

Author: Peter Mortensen, 2009-06-09

7 answers

Depende de cómo formatee el Guid:

  • Guid.NewGuid().ToString() => 36 caracteres (Con guiones)
    productos: 12345678-1234-1234-1234-123456789abc

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

  • Guid.NewGuid().ToString("N") => 32 caracteres (solo dígitos)
    productos: 12345678123412341234123456789abc

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

  • Guid.NewGuid().ToString("P") => 38 personajes (Paréntesis)
    productos: (12345678-1234-1234-1234-123456789abc)

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

 627
Author: stevehipwell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-31 11:26:12

36, y el GUID solo utilizará 0-9A-F (hexidecimal!).

12345678-1234-1234-1234-123456789012

Son 36 caracteres en cualquier GUID are son de longitud constante. Puedes leer un poco más sobre las complejidades de los GUIDs aquí.

Necesitarás dos más de largo si quieres guardar los tirantes.

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

 56
Author: Eric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-17 04:13:11

El correcto lo que hay que hacer aquí es almacenarlo 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 se reduce a cómo elige codificarlo. Como hexadecimal (TAMBIÉN conocido como codificación base-16) sin guiones sería de 32 caracteres (dos dígitos hexadecimales por byte), así que char(32).

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

 24
Author: Marc Gravell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-14 07:59:21

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

 8
Author: Ross Light,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-09 04:47:35

Los GUID son 128bits, 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 igual de eficiente utilizando bases más pequeñas que 95 también; base 85 es la más pequeña posible que todavía cabe en 20 caracteres:

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

:-)

 4
Author: cnd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-29 04:02:09

22 bytes, si lo haces así:

System.Guid guid = System.Guid.NewGuid();
byte[] guidbytes = guid.ToByteArray();
string uuid = Convert.ToBase64String(guidbytes).Trim('=');
 2
Author: Qodex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-19 21:43:36

Las cadenas binarias almacenan datos de bytes sin procesar, mientras que las cadenas de caracteres almacenan texto. Utilice datos binarios al almacenar valores hexadecimales como SID, GUID y así sucesivamente. El tipo de datos uniqueidentifier contiene un identificador único global o GUID. Este el valor se deriva usando 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

Se aplica a: SQL Server El el siguiente ejemplo crea la tabla cust con un tipo de datos uniqueidentifier y usa NEWID para rellenar la tabla con un valor predeterminado. 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
 0
Author: Hunter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-07 14:55:45