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 lo varchar
que debería esperar de un GUID? ¿Es una longitud estática?
¿Debo usar nvarchar
(GUID alguna vez usará caracteres Unicode)?
varchar(Guid.Length)
PD. No quiero usar un tipo de datos guid de fila SQL. Solo estoy preguntando qué es Guid.MaxLength
.
Guid.NewGuid
no tiene "longitud de cadena" implícita; Todo depende del formato utilizado en ToString (el sin argumentoToString
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.Respuestas:
Depende de cómo formatee el Guid:
Guid.NewGuid().ToString()
=> 36 caracteres (guionizados)salidas:
12345678-1234-1234-1234-123456789abc
Guid.NewGuid().ToString("D")
=> 36 caracteres (con guión, igual queToString()
)salidas:
12345678-1234-1234-1234-123456789abc
Guid.NewGuid().ToString("N")
=> 32 caracteres (solo dígitos)salidas:
12345678123412341234123456789abc
Guid.NewGuid().ToString("B")
=> 38 caracteres (llaves)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 (hexadecimales)salidas:
{0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0x9a,0xbc}}
fuente
byte[16]
.36, y el GUID solo usará 0-9A-F (¡hexadecimal!).
12345678-1234-1234-1234-123456789012
Son 36 caracteres en cualquier GUID; tienen una longitud constante. Puede leer un poco más sobre las complejidades de los GUID aquí .
Necesitará dos más de longitud si desea almacenar los frenos.
Nota: 36 es la longitud de la cadena con los guiones en el medio. En realidad son números de 16 bytes.
fuente
Lo correcto aquí es almacenarlo como
uniqueidentifier
: esto es completamente indexable, etc. en la base de datos. La siguiente mejor opción sería unabinary(16)
columna: 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 (codificación AKA base-16) sin guiones, tendría 32 caracteres (dos dígitos hexadecimales por byte), entonces
char(32)
.Sin embargo, es posible que desee 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 te da 22 caracteres, entonceschar(22)
. No hay necesidad de usar Unicode ni de longitud variable, por lonvarchar(max)
que sería una mala elección, por ejemplo.fuente
uniqueidentifer
completamente indexable perobinary(16)
no lo es?Creo que los GUID están restringidos a longitudes de 16 bytes (o 32 bytes para un equivalente hexadecimal ASCII).
fuente
Los GUID son de 128 bits, o
Entonces, sí, un mínimo de 20 caracteres de longitud, lo que en realidad está desperdiciando más de 4.25 bits, por lo que también puede ser tan eficiente usando bases más pequeñas que 95; la base 85 es la más pequeña posible que aún cabe en 20 caracteres:
:-)
fuente
22 bytes, si lo haces así:
fuente
Las cadenas binarias almacenan datos de bytes sin procesar, mientras que las cadenas de caracteres almacenan texto. Utilice datos binarios cuando almacene valores hexadecimales como
SID
,GUID
etc. El tipo de datos de identificador único contiene un identificador único global o GUID. Este valor se deriva mediante el uso de 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.
Se aplica a: SQL Server El siguiente ejemplo crea la tabla cust con un tipo de datos de identificador único y usa NEWID para llenar 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.
fuente