Eu quero criar uma coluna varchar no SQL que deve conter N'guid'
enquanto guid
é um GUID gerado pelo .NET ( Guid.NewGuid ) - classe System.Guid.
Qual a duração varchar
esperada de um GUID? É um comprimento estático?
Devo usar nvarchar
(o GUID usará caracteres Unicode)?
varchar(Guid.Length)
PS. Eu não quero usar um tipo de dados guid de linha SQL. Estou apenas perguntando o que é Guid.MaxLength
.
Guid.NewGuid
não possui "comprimento de string" implícito; Tudo depende do formato usado no ToString (o argumento semToString
usa formatação "D"). Prefiro "B", pois é mais fácil "ver que é um GUID", mas isso é apenas familiaridade e convenção.Respostas:
Depende de como você formata o Guid:
Guid.NewGuid().ToString()
=> 36 caracteres (hifenizados)saídas:
12345678-1234-1234-1234-123456789abc
Guid.NewGuid().ToString("D")
=> 36 caracteres (hifenizados, iguais aToString()
)saídas:
12345678-1234-1234-1234-123456789abc
Guid.NewGuid().ToString("N")
=> 32 caracteres (apenas dígitos)saídas:
12345678123412341234123456789abc
Guid.NewGuid().ToString("B")
=> 38 caracteres (chaves)saídas:
{12345678-1234-1234-1234-123456789abc}
Guid.NewGuid().ToString("P")
=> 38 caracteres (parênteses):
(12345678-1234-1234-1234-123456789abc)
Guid.NewGuid().ToString("X")
=> 68 caracteres (hexadecimais) desaída:
{0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0x9a,0xbc}}
fonte
byte[16]
.36, e o GUID usará apenas 0-9A-F (hexidecimal!).
12345678-1234-1234-1234-123456789012
São 36 caracteres em qualquer GUID - eles são de comprimento constante. Você pode ler um pouco mais sobre os meandros dos GUIDs aqui .
Você precisará de mais dois se quiser armazenar os aparelhos.
Nota: 36 é o comprimento da corda com os traços no meio. Na verdade, são números de 16 bytes.
fonte
A coisa correta a fazer aqui é armazená-lo como
uniqueidentifier
- isso é totalmente indexável etc. no banco de dados. A próxima melhor opção seria umabinary(16)
coluna: os GUIDs padrão têm exatamente 16 bytes de comprimento.Se você deve armazená-lo como uma sequência, o comprimento realmente se resume a como você escolhe codificá-lo. Como hexadecimal (codificação AKA base-16) sem hífens, seriam 32 caracteres (dois dígitos hexadecimais por byte)
char(32)
.No entanto, você pode desejar para armazenar os hífens. Se você está com pouco espaço, mas seu banco de dados não suporta blobs / guids nativamente, você pode usar codificação Base64 e remover o
==
sufixo de preenchimento; que fornece 22 caracteres, entãochar(22)
. Não há necessidade de usar Unicode nem comprimento variável - portanto,nvarchar(max)
seria uma má escolha, por exemplo.fonte
uniqueidentifer
totalmente indexável, masbinary(16)
não é?Acredito que os GUIDs sejam restritos a comprimentos de 16 bytes (ou 32 bytes para um equivalente hexadecimal ASCII).
fonte
GUIDs são 128 bits ou
Portanto, sim, com 20 caracteres no mínimo, o que realmente está desperdiçando mais de 4,25 bits, para que você possa ser igualmente eficiente usando bases menores que 95 também; a base 85 é a menor possível que ainda se encaixa em 20 caracteres:
:-)
fonte
22 bytes, se você fizer assim:
fonte
Cadeias binárias armazenam dados de bytes brutos, enquanto cadeias de caracteres armazenam texto. Use dados binários ao armazenar valores hexi-decimais, como
SID
,GUID
e assim por diante. O tipo de dados uniqueidentifier contém um identificador globalmente exclusivo, ou GUID. Este valor é derivado usando a função NEWID () para retornar um valor exclusivo para todos os objetos. Ele é armazenado como um valor binário, mas é exibido como uma sequência de caracteres.Aqui está um exemplo.
Aplica-se a: SQL Server O exemplo a seguir cria a tabela cust com um tipo de dados identificador exclusivo e usa NEWID para preencher a tabela com um valor padrão. Ao atribuir o valor padrão de NEWID (), cada linha nova e existente possui um valor exclusivo para a coluna Código do Cliente.
fonte